Вообще какая история у меня был в пакете тип:
data Foo = Foo { fooId :: Index, ...}
который содержал в себе поля для вложенного типа, ну просто исторически. В другом пакете был свой Foo уже без лишнего и
da
ta FooV = FooV { foo :: ПравльныйFoo, ...}
Но из-за этого много логики дублировалось или что хуже дублировалось с небольшими модификациями, это работает, но поддерживать дорого.
В итоге захотелось правильный Foo вынести в отдельный пакет со всем зиллионом функций для работы с ними, а в остальных оставить расширения. Но при этом нигде нельзя поломать binary и json encoding, и желательно не сойти с ума при рефакторинге