1. универсальных советов нет
2. UndecidableInstances — обычно плохо, не используйте их. чтобы их не приходилось использовать, оборачивайте в newtype
3. AmbiguousTypes — ничего плохого. если вам мешают собачки, передавайте специальный аргумент-метку, несущий типы, например, Proxy