Classes with exactly one method and no superclass (or one superclass and no method) are called "unary classes". And yes, they are still implemented with no overhead.
See this long Note:
I find type classes very difficult to
evolve in a way that satisfies my stability needs. Part of the reason
for this is that type classes as typically used don't really permit
any form of data abstraction: you list out all the methods explicitly
in the class definition. There is no data hiding.
That's odd. Can't you say
```
module M( C, warble ) where
class C a where { op1, op2 :: a -> a }
warble :: C a => a -> a
warble = ...
```
and now a client of `M` can see `C` and `warble` but has no idea of the methods.
Of course if a client wants to make a new data type T into an instance of C then they need to know the methods, but that's reasonable: to make T an instance of C we must provide a witness for `op1` and `op2`. So your teaser is indeed teasing.
Simon