On the contrary, this is both very common and is considered good practice where appropriate. Haskell's strong static typing and compilers will make sure there is never any ambiguity as to which instance is used. Everything has to tightly fit together or else your program won't compile.