Haskell type classes by default pick the implementation based on a single type variable in its signature, but it can occur in multiple positions (including the return type). A commonly used language extension (multi parameter type classes) extends this to an arbitrary number of type variables.
Multiple dispatch means functions are generic, and all arguments are considered when deciding which implementation to call.
Snigl supports both multiple dispatch and pattern matching, as does Common Lisp.