I think the "show a simple type, then the 'real' type " solution is pretty good ( especially since you need to be doing type level programming to hit issues where the simple type doesn't hold anyways) , but on the topic of several languages: doesn't Haskell98 kind of solve the teaching issue? If you're using the standard stuff stick to the old $...