The term type is often used in the world of value-oriented programming to mean data representation. In the object-oriented world it usually refers to behavior rather than to representation. In the VOS, type is used to mean both of these things: two entities have the same type if and only if they have both compatible representations and behaviors. Thus, in the VOS, if one type is derived from a base type, then instances of the derived type may be substituted for instances of the base type because both the representation and the behavior are compatible.
In the VOS, unlike some OOP languages, two objects that have fundamentally different representations have different types. Some OOP languages use a different notion of type. They consider two objects to have the same type if they respond in the same way to the same set of messages. This notion is captured in the VOS by saying that the objects implement the same interface.
Similarly, some OOP languages consider message passing to be the fundamental model of computation. In the VOS, this corresponds closely (but not exactly) to calling virtual methods (see Virtual Methods).
The VOS itself does not directly capture the notion of “typeless programming.” That is, there is no way to call a method (other than a static method) without knowing the type of the object. Nevertheless, typeless programming can be implemented in the VES by writing a custom message dispatch mechanism and using it directly, generally based on the facilities provided by the types in System.Reflection. When interoperating with other languages this dispatch mechanism needs to be packaged into exposed methods so that other languages can access the underlying mechanism. Similarly, the message dispatch mechanism must understand and interoperate with the VOS method mechanism to allow objects implemented in other languages to be accessed.