Change/higher kinded

This is the new higher-kinded scheme. 
`&& !isFinal` for further optimization?