I think a good metric for classes is the final assignment, since it captures "how far" the class goes. For reference, the final assignments are:
106A --- It varies, but has recently been a text-based "Adventure"-style game (in Java) that requires tracking the map, player state, various objects and their capabilities, etc. I think there might also be a small graphical component.
106B/X --- Again, it varies, but the best assignment (in my view) is a BASIC interpreter that implements both a REPL and stored programs. All C++, it's about building a big list of abstract expressions of different types (assignment, etc) that can be executed by walking that list (taking advantage of dynamic dispatch) and tracking global program state. It's a nice intersection of data structures and (very simple) recursive descent parsing.
107 --- A heap allocator to implement malloc(), realloc(), and free(), written on top of mmap(). A fantastic assignment.
So yeah, they're not trivial classes.