Hypothetical reasoning in type classes