A bit unrelated, but the other day I noticed Rust also has higher rank *constraints* (e.g. for<'a> &'a T: Send) but only for lifetimes, not types. AFAIK, even Haskell doesn't have this, although you can emulate it
I think there are 2 things type classes let you do which are kinda orthogonal
- Logic programming (might be more performant/user friendly with a dedicated system)
- Implicitly passing records around (which is where you get into problems with coherence)