The idea of adding a label (`resolver') is very old. Here is the examples of how far you can take it: http://okmij.org/ftp/Haskell/TypeClass.html#Haskell1 We can represent all of Haskell98 classes plus functional dependencies with only one, predefined type class.