Ada 83 is an abstraction-oriented programming language. It supports the definition of abstract data types in modules called ''packages,'' with a separate interface and implementation. The next revision of the language is now being prepared, and is designated Ada 9X. This revision will support full object-oriented programming. As part of designing the object-oriented features of Ada 9X, we had a choice whether to construct a conventional but essentially independent object-oriented capability in addition to the existing abstraction-oriented features of Ada 83, or to make an effort to integrate the existing abstraction support with the minimal set of additional capabilities necessary to support object-oriented programming. We have chosen the latter approach, and as part of this effort, we have tried to isolate exactly what capabilities distinguish a full object-oriented programming language from an abstraction-oriented programming language like Ada 83. Our conclusion is that the essential new capability of object-oriented programming is that a given abstraction may effectively have multiple implementations. The objects carry sufficient extra information at run-time to identify to which implementation they correspond. In Ada 9X, we call this run-time type identification the ''tag'' of the object, and the corresponding new language capability is called ''tagged types.''