While the conclusions are correct the comments about C# are wrong. C# started with a unified type system -- all types both scalar and classes inherit from a single root class called System.Object. Ot had value types and reference type from the start. And it's byte-code format to handle that situation from the start.
Also there was no "flag day" for the C# when generics were added. The situation between C# and Java when generics were added to both languages was exactly the same. The only difference is, due to the unified type system, C# supported scalar generic type parameters from the start.
System.ValueType was in .NET 1.0? Interesting, I didn't know that. (There are no docs on MSDN for 1.0, and I came in at .NET 2.0, so that's before me.)
In MDSN, you use the drop-down to change the version of framework you're looking at for documentation. Here is the ValueType class documentation for .NET 1.1:
Believe me, I spend plenty of time up in there to make sure this library I wrote will be cool with .NET 3.5 or whatever. =) I wasn't sure if that had been wedged in with .NET 1.1. I've never seen even 1.1 in the wild.
Also there was no "flag day" for the C# when generics were added. The situation between C# and Java when generics were added to both languages was exactly the same. The only difference is, due to the unified type system, C# supported scalar generic type parameters from the start.