The use of hierarchy is an important component of object-oriented desi
gn. Hierarchy allows the use of type families, in which higher level s
upertypes capture the behavior that all of their subtypes have in comm
on. For this methodology to be effective, it is necessary to have a cl
ear understanding of how subtypes and supertypes are related. This pap
er takes the position that the relationship should ensure that any pro
perty proved about supertype objects also holds for its subtype object
s. It presents two ways of defining the subtype relation, each of whic
h meets this criterion, and each of which is easy for programmers to u
se, The subtype relation is based on the specifications of the sub- an
d supertypes; the paper presents a way of specifying types that makes
it convenient to define the subtype relation. The paper also discusses
the ramifications of this notion of subtyping on the design of type f
amilies.