Для генерируемых типов, как мне кажется, очень хорошо мог бы подойти подход, используемый
@danslapman - аппликативные схемы.
Вы зависите от одной небольшой библиотеки, ядро которой можно в крайнем случае скопипастить, и генерируете универсальную схему данных, на основании которой можно строить инстансы большинства остальных тайпклассов без макросов. Это и в скалу 3 лучше портируется