Type classes are rather fragile: it's really hard to make changes to a type class once because it can often break code downstream.
Type classes are in a sense like implicit parameters, with the additional constraint of coherency. If we think of them as such, then defining an instance such as
instance Monad Maybe where
(>>=) = …