All the things Brian said are, more or less, also true for the poor man's version. Typeclasses allow overloading, period. Operator overloading is a specific kind of overloading.
One additional capability of typeclasses Brian didn't mention (although it needs another type system feature: type constructors), is that they allow to abstract over higher-order types, e.g.
class Functor f where
fmap :: a -> b -> f a -> f b
of which, for example,
![Angel [A]](/emoticons/emotion-13.gif)
would be an instance. This is of course not possible with the library above - one would need the ability, besides typeclasses, to write a higher order type, e.g. in F#-ish notation 'a 't for any 't.
Kurt
http://fortysix-and-two.blogspot.com/