The key difference between value types and reference types is that value types are stored on the stack but reference types are stored in the heap. (Actually, this isn't quite the correct definition, value/reference type refers to the semantics of how they behave in situations, it's easiest to think about this in terms of a local stack and a global heap, but it doesn't necessarily have to be implemented like this)
All types (reference and value) inherit from Object. (Although, like others have said it is possible to define one that doesn't, but not in C#, you have to do it in raw IL)
In order for a value type to call a method on the base Object type it must first be boxed so it can be treated as a reference type (boxing is the process of taking a value type and shoving it into a reference type shaped box so it is on the heap and behaves like a reference type). However, most of the common numeric value types like Int32 implement their own versions of ToString so they don't have to be boxed to call them.
Value types, can have methods and properties just like reference types. The limitations are that structs (C#'s value types) don't support inheritance (except from Object) or finalizers.
There is a good article on the differences here .