On the whole it looks like you want type variables with kind #. There are very good implementation reasons for not allowing this. If you had type variables of kind # you could have polymorphic functions over unboxed values. But since the values are unboxed they don't have a uniform representation (e.g., a Double# is probably twice the size of a Float#). So polymorphic functions over unboxed values are not easy to implement. (You can imagine implementations of them, but none of them are pleasent.)
That reminds me of something that I have wondered about for some time. Why is there such reluctance to instantiate polymorhic functions with the types with which they are used? (This isn't done automatically in complilers right?) I can imagine that it is akward to delay code generation until all uses of a function are known, and that in some cases there may be infinitely many instances needed. But apart from that, what are the reasons against this implementation technique? /Niklas