Как пример - сериализация без рефлексии. Делаешь трейт:
trait MySerialization {
fn serialize(&self) -> Vec<u8>
}
Ты хочешь обьявить такую свою абстракцию для примитивных типов и типов из стандратной библиотеки.
И в случае интерфейсов тебе бы пришлось городить адаптеры, чтобы такой дизайн работал, либо делать решение через рефлексию, где теряются компайл-тайм проверки того, что данный тип можно сериализовать.
А в случае тайпклассов - оно работает из коробки, т.к. ты можешь реализовать свои тайпклассы для чужих типов.
Поэтому библиотеки на тайпклассах получаются более модульными и удобными для конечного пользователя без потерь в типобезопасности.