Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision b0837e4dfda21dcfd8fa2bbaaaf2078ad86ba096)
+++ src/CodeGen/CodeGenerator.cc	(revision f0ecf9bfb3ccc333894542767cb1c491f7e79993)
@@ -288,5 +288,5 @@
 		assertf( ! genC, "TypeDecls should not reach code generation." );
 		output << typeDecl->genTypeString() << " " << typeDecl->name;
-		if ( typeDecl->get_kind() != TypeDecl::Any && typeDecl->sized ) {
+		if ( typeDecl->sized ) {
 			output << " | sized(" << typeDecl->name << ")";
 		}
Index: src/GenPoly/InstantiateGeneric.cc
===================================================================
--- src/GenPoly/InstantiateGeneric.cc	(revision b0837e4dfda21dcfd8fa2bbaaaf2078ad86ba096)
+++ src/GenPoly/InstantiateGeneric.cc	(revision f0ecf9bfb3ccc333894542767cb1c491f7e79993)
@@ -238,6 +238,6 @@
 					assertf( false, "Ttype parameters are not currently allowed as parameters to generic types." );
 					break;
-				case TypeDecl::Any:
-					assertf( false, "otype parameters handled by baseParam->isComplete()." );
+				default:
+					assertf( false, "Unhandled type parameter kind" );
 					break;
 			}
Index: src/GenPoly/ScrubTyVars.cc
===================================================================
--- src/GenPoly/ScrubTyVars.cc	(revision b0837e4dfda21dcfd8fa2bbaaaf2078ad86ba096)
+++ src/GenPoly/ScrubTyVars.cc	(revision f0ecf9bfb3ccc333894542767cb1c491f7e79993)
@@ -40,5 +40,4 @@
 		if ( tyVar != tyVars->end() ) {
 			switch ( tyVar->second.kind ) {
-			  case TypeDecl::Any:
 			  case TypeDecl::Dtype:
 			  case TypeDecl::Ttype:
Index: src/Parser/DeclarationNode.cc
===================================================================
--- src/Parser/DeclarationNode.cc	(revision b0837e4dfda21dcfd8fa2bbaaaf2078ad86ba096)
+++ src/Parser/DeclarationNode.cc	(revision f0ecf9bfb3ccc333894542767cb1c491f7e79993)
@@ -1031,8 +1031,9 @@
 
 	if ( variable.tyClass != NoTypeClass ) {
-		static const TypeDecl::Kind kindMap[] = { TypeDecl::Any, TypeDecl::Dtype, TypeDecl::Ftype, TypeDecl::Ttype };
-		assertf( sizeof(kindMap)/sizeof(kindMap[0] == NoTypeClass-1), "DeclarationNode::build: kindMap is out of sync." );
+		// otype is internally converted to dtype + otype parameters
+		static const TypeDecl::Kind kindMap[] = { TypeDecl::Dtype, TypeDecl::Dtype, TypeDecl::Ftype, TypeDecl::Ttype };
+		assertf( sizeof(kindMap)/sizeof(kindMap[0]) == NoTypeClass, "DeclarationNode::build: kindMap is out of sync." );
 		assertf( variable.tyClass < sizeof(kindMap)/sizeof(kindMap[0]), "Variable's tyClass is out of bounds." );
-		TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable.initializer ? variable.initializer->buildType() : nullptr );
+		TypeDecl * ret = new TypeDecl( *name, Type::StorageClasses(), nullptr, kindMap[ variable.tyClass ], variable.tyClass == Otype, variable.initializer ? variable.initializer->buildType() : nullptr );
 		buildList( variable.assertions, ret->get_assertions() );
 		return ret;
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision b0837e4dfda21dcfd8fa2bbaaaf2078ad86ba096)
+++ src/Parser/TypeData.cc	(revision f0ecf9bfb3ccc333894542767cb1c491f7e79993)
@@ -406,7 +406,8 @@
 void buildForall( const DeclarationNode * firstNode, ForallList &outputList ) {
 	buildList( firstNode, outputList );
-	for ( typename ForallList::iterator i = outputList.begin(); i != outputList.end(); ++i ) {
+	auto n = firstNode;
+	for ( typename ForallList::iterator i = outputList.begin(); i != outputList.end(); ++i, n = (DeclarationNode*)n->get_next() ) {
 		TypeDecl * td = static_cast<TypeDecl *>(*i);
-		if ( td->get_kind() == TypeDecl::Any ) {
+		if ( n->variable.tyClass == DeclarationNode::Otype ) {
 			// add assertion parameters to `type' tyvars in reverse order
 			// add dtor:  void ^?{}(T *)
@@ -798,5 +799,5 @@
 		ret = new TypedefDecl( name, scs, typebuild( td->base ), linkage );
 	} else {
-		ret = new TypeDecl( name, scs, typebuild( td->base ), TypeDecl::Any );
+		ret = new TypeDecl( name, scs, typebuild( td->base ), TypeDecl::Dtype, true );
 	} // if
 	buildList( td->symbolic.params, ret->get_parameters() );
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision b0837e4dfda21dcfd8fa2bbaaaf2078ad86ba096)
+++ src/ResolvExpr/Unify.cc	(revision f0ecf9bfb3ccc333894542767cb1c491f7e79993)
@@ -138,5 +138,4 @@
 	bool tyVarCompatible( const TypeDecl::Data & data, Type *type ) {
 		switch ( data.kind ) {
-		  case TypeDecl::Any:
 		  case TypeDecl::Dtype:
 			// to bind to an object type variable, the type must not be a function type.
Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision b0837e4dfda21dcfd8fa2bbaaaf2078ad86ba096)
+++ src/SymTab/Autogen.cc	(revision f0ecf9bfb3ccc333894542767cb1c491f7e79993)
@@ -696,5 +696,5 @@
 			if ( TypeInstType * ty = dynamic_cast< TypeInstType * >( t ) ) {
 				if ( ! done.count( ty->get_baseType() ) ) {
-					TypeDecl * newDecl = new TypeDecl( ty->get_baseType()->get_name(), Type::StorageClasses(), nullptr, TypeDecl::Any );
+					TypeDecl * newDecl = new TypeDecl( ty->get_baseType()->get_name(), Type::StorageClasses(), nullptr, TypeDecl::Dtype, true );
 					TypeInstType * inst = new TypeInstType( Type::Qualifiers(), newDecl->get_name(), newDecl );
 					newDecl->get_assertions().push_back( new FunctionDecl( "?=?", Type::StorageClasses(), LinkageSpec::Cforall, genAssignType( inst ), nullptr,
Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision b0837e4dfda21dcfd8fa2bbaaaf2078ad86ba096)
+++ src/SymTab/Mangler.cc	(revision f0ecf9bfb3ccc333894542767cb1c491f7e79993)
@@ -214,7 +214,4 @@
 			numStream << varNum->second.first;
 			switch ( (TypeDecl::Kind )varNum->second.second ) {
-			  case TypeDecl::Any:
-				mangleName << "t";
-				break;
 			  case TypeDecl::Dtype:
 				mangleName << "d";
@@ -274,7 +271,4 @@
 			for ( Type::ForallList::iterator i = type->forall.begin(); i != type->forall.end(); ++i ) {
 				switch ( (*i)->get_kind() ) {
-				  case TypeDecl::Any:
-					tcount++;
-					break;
 				  case TypeDecl::Dtype:
 					dcount++;
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision b0837e4dfda21dcfd8fa2bbaaaf2078ad86ba096)
+++ src/SynTree/Declaration.h	(revision f0ecf9bfb3ccc333894542767cb1c491f7e79993)
@@ -200,5 +200,5 @@
 	typedef NamedTypeDecl Parent;
   public:
-	enum Kind { Any, Dtype, Ftype, Ttype };
+	enum Kind { Dtype, Ftype, Ttype };
 
 	Type * init;
@@ -216,5 +216,5 @@
 	};
 
-	TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, Type * init = nullptr );
+	TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, bool sized, Type * init = nullptr );
 	TypeDecl( const TypeDecl &other );
 	virtual ~TypeDecl();
@@ -225,5 +225,5 @@
 	TypeDecl * set_init( Type * newValue ) { init = newValue; return this; }
 
-	bool isComplete() const { return kind == Any || sized; }
+	bool isComplete() const { return sized; }
 	bool get_sized() const { return sized; }
 	TypeDecl * set_sized( bool newValue ) { sized = newValue; return this; }
Index: src/SynTree/TypeDecl.cc
===================================================================
--- src/SynTree/TypeDecl.cc	(revision b0837e4dfda21dcfd8fa2bbaaaf2078ad86ba096)
+++ src/SynTree/TypeDecl.cc	(revision f0ecf9bfb3ccc333894542767cb1c491f7e79993)
@@ -21,5 +21,5 @@
 #include "Type.h"            // for Type, Type::StorageClasses
 
-TypeDecl::TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, Type * init ) : Parent( name, scs, type ), init( init ), sized( kind == Any || kind == Ttype ), kind( kind ) {
+TypeDecl::TypeDecl( const std::string &name, Type::StorageClasses scs, Type *type, Kind kind, bool sized, Type * init ) : Parent( name, scs, type ), init( init ), sized( kind == Ttype || sized ), kind( kind ) {
 }
 
@@ -32,10 +32,14 @@
 
 std::string TypeDecl::typeString() const {
-	static const std::string kindNames[] = { "type", "incomplete type", "function type", "tuple type" };
-	return (kind != Any && isComplete() ? "sized " : "") + kindNames[ kind ];
+	static const std::string kindNames[] = { "object type", "function type", "tuple type" };
+	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, "typeString: kindNames is out of sync." );
+	assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
+	return (isComplete() ? "sized " : "") + kindNames[ kind ];
 }
 
 std::string TypeDecl::genTypeString() const {
-	static const std::string kindNames[] = { "otype", "dtype", "ftype", "ttype" };
+	static const std::string kindNames[] = { "dtype", "ftype", "ttype" };
+	assertf( sizeof(kindNames)/sizeof(kindNames[0]) == DeclarationNode::NoTypeClass-1, "genTypeString: kindNames is out of sync." );
+	assertf( kind < sizeof(kindNames)/sizeof(kindNames[0]), "TypeDecl's kind is out of bounds." );
 	return kindNames[ kind ];
 }
Index: src/Tuples/TupleExpansion.cc
===================================================================
--- src/Tuples/TupleExpansion.cc	(revision b0837e4dfda21dcfd8fa2bbaaaf2078ad86ba096)
+++ src/Tuples/TupleExpansion.cc	(revision f0ecf9bfb3ccc333894542767cb1c491f7e79993)
@@ -204,5 +204,5 @@
 			decl->set_body( true );
 			for ( size_t i = 0; i < tupleSize; ++i ) {
-				TypeDecl * tyParam = new TypeDecl( toString( "tuple_param_", tupleSize, "_", i ), Type::StorageClasses(), nullptr, TypeDecl::Any );
+				TypeDecl * tyParam = new TypeDecl( toString( "tuple_param_", tupleSize, "_", i ), Type::StorageClasses(), nullptr, TypeDecl::Dtype, true );
 				decl->get_members().push_back( new ObjectDecl( toString("field_", i ), Type::StorageClasses(), LinkageSpec::C, nullptr, new TypeInstType( Type::Qualifiers(), tyParam->get_name(), tyParam ), nullptr ) );
 				decl->get_parameters().push_back( tyParam );
