for me a rule of thumb for choosing features / extensions is: if I see compiler errors, I should understand them and know how to fix them.
Parameterized types, type sinonyms, records and classes with as few extensions as possible are pretty much all I use, type wise. You can do a lot with them alone.