One thing I quite don't understand is: do we really need to make the newtype/data distinction explicit? If we used only one keyword, it should be quite easy for the compiler to detect the distinction statically.
I think someone more knowledgable in Haskell than me should answer this.