Стандартный прием для выбора экземпляра - создать новый тип. Итак:
newtype DescribeViaTypeable a = DVT a
newtype DescribeViaShow a = DVS a
instance Show a => Described (DescribeViaShow a) where describe (DVS x) = show x
instance Typeable a => Described (DescribeViaTypeable a) where describe (DVT x) = show (typeOf x)
Теперь вызывающие абоненты могут выбирать, какое описание им нравится, если оба доступны, и типы данных могут быть явными о том, какое описание они ожидают получить для своих полей, устраняя любую магию.