string is pretty much what is told but why you are able to do this
int i = new int();
is for consistency but the allocation is not in heap and its not used as reference and the simple reason I can think of is the compiler never knows what is the type (reference / value) and so for basic types its always the value type.