Аргумент за тайпклассы при наличии первоклассных модулей.
Ну ИМХО, всегда явно передавать в полиморфную функцию модуль, который однозначно определяется из типа «настоящего» аргумента – это как всегда явно указывать у значения тип, когда он легко может быть выведен