What are possible implementations of Haskell's type classes and what are their (dis)advantages?
JHC uses a different approach.  The compiler's intermediate language is a dependently typed lambda-calculus where there is no distinction between types and values.  JHC therefore can perform a case analysis on the type parameter of a function and call the correct overloaded function directly.

The JHC website goes into some depth on the implementation, as well as its advantages over the standard dictionary passing implementation.