Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/AST/Convert.cpp	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -1162,5 +1162,5 @@
 	}
 
-	const ast::Type * postvisit( const ast::ReferenceToType * old, ReferenceToType * ty ) {
+	const ast::Type * postvisit( const ast::BaseInstType * old, ReferenceToType * ty ) {
 		ty->forall = get<TypeDecl>().acceptL( old->forall );
 		ty->parameters = get<Expression>().acceptL( old->params );
@@ -2521,5 +2521,5 @@
 	}
 
-	void postvisit( const ReferenceToType * old, ast::ReferenceToType * ty ) {
+	void postvisit( const ReferenceToType * old, ast::BaseInstType * ty ) {
 		ty->forall = GET_ACCEPT_V( forall, TypeDecl );
 		ty->params = GET_ACCEPT_V( parameters, Expr );
Index: src/AST/Fwd.hpp
===================================================================
--- src/AST/Fwd.hpp	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/AST/Fwd.hpp	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -107,5 +107,5 @@
 class QualifiedType;
 class FunctionType;
-class ReferenceToType;
+class BaseInstType;
 template<typename decl_t> class SueInstType;
 using StructInstType = SueInstType<StructDecl>;
Index: src/AST/GenericSubstitution.cpp
===================================================================
--- src/AST/GenericSubstitution.cpp	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/AST/GenericSubstitution.cpp	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -42,5 +42,5 @@
 	private:
 		// make substitution for generic type
-		void makeSub( const ReferenceToType * ty ) {
+		void makeSub( const BaseInstType * ty ) {
 			visit_children = false;
 			const AggregateDecl * aggr = ty->aggr();
Index: src/AST/Node.cpp
===================================================================
--- src/AST/Node.cpp	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/AST/Node.cpp	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -266,6 +266,6 @@
 template class ast::ptr_base< ast::FunctionType, ast::Node::ref_type::weak >;
 template class ast::ptr_base< ast::FunctionType, ast::Node::ref_type::strong >;
-template class ast::ptr_base< ast::ReferenceToType, ast::Node::ref_type::weak >;
-template class ast::ptr_base< ast::ReferenceToType, ast::Node::ref_type::strong >;
+template class ast::ptr_base< ast::BaseInstType, ast::Node::ref_type::weak >;
+template class ast::ptr_base< ast::BaseInstType, ast::Node::ref_type::strong >;
 template class ast::ptr_base< ast::StructInstType, ast::Node::ref_type::weak >;
 template class ast::ptr_base< ast::StructInstType, ast::Node::ref_type::strong >;
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/AST/Print.cpp	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -270,5 +270,5 @@
 	}
 
-	void preprint( const ast::ReferenceToType * node ) {
+	void preprint( const ast::BaseInstType * node ) {
 		print( node->forall );
 		print( node->attributes );
Index: src/AST/SymbolTable.cpp
===================================================================
--- src/AST/SymbolTable.cpp	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/AST/SymbolTable.cpp	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -313,5 +313,5 @@
 		if ( ! expr->result ) continue;
 		const Type * resTy = expr->result->stripReferences();
-		auto aggrType = dynamic_cast< const ReferenceToType * >( resTy );
+		auto aggrType = dynamic_cast< const BaseInstType * >( resTy );
 		assertf( aggrType, "WithStmt expr has non-aggregate type: %s",
 			toString( expr->result ).c_str() );
@@ -654,5 +654,5 @@
 			if ( dwt->name == "" ) {
 				const Type * t = dwt->get_type()->stripReferences();
-				if ( auto rty = dynamic_cast<const ReferenceToType *>( t ) ) {
+				if ( auto rty = dynamic_cast<const BaseInstType *>( t ) ) {
 					if ( ! dynamic_cast<const StructInstType *>(rty)
 						&& ! dynamic_cast<const UnionInstType *>(rty) ) continue;
Index: src/AST/Type.cpp
===================================================================
--- src/AST/Type.cpp	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/AST/Type.cpp	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -124,12 +124,12 @@
 }
 
-// --- ReferenceToType
-
-void ReferenceToType::initWithSub( const ReferenceToType & o, Pass< ForallSubstitutor > & sub ) {
+// --- BaseInstType
+
+void BaseInstType::initWithSub( const BaseInstType & o, Pass< ForallSubstitutor > & sub ) {
 	ParameterizedType::initWithSub( o, sub ); // initialize substitution
 	params = sub.core( o.params );            // apply to parameters
 }
 
-ReferenceToType::ReferenceToType( const ReferenceToType & o )
+BaseInstType::BaseInstType( const BaseInstType & o )
 : ParameterizedType( o.qualifiers, copy( o.attributes ) ), params(), name( o.name ), 
   hoistType( o.hoistType ) {
@@ -138,5 +138,5 @@
 }
 
-std::vector<readonly<Decl>> ReferenceToType::lookup( const std::string& name ) const {
+std::vector<readonly<Decl>> BaseInstType::lookup( const std::string& name ) const {
 	assertf( aggr(), "Must have aggregate to perform lookup" );
 
@@ -153,5 +153,5 @@
 SueInstType<decl_t>::SueInstType(
 	const decl_t * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as )
-: ReferenceToType( b->name, q, move(as) ), base( b ) {}
+: BaseInstType( b->name, q, move(as) ), base( b ) {}
 
 template<typename decl_t>
@@ -168,10 +168,10 @@
 TraitInstType::TraitInstType(
 	const TraitDecl * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as )
-: ReferenceToType( b->name, q, move(as) ), base( b ) {}
+: BaseInstType( b->name, q, move(as) ), base( b ) {}
 
 // --- TypeInstType
 
 TypeInstType::TypeInstType( const TypeInstType & o )
-: ReferenceToType( o.name, o.qualifiers, copy( o.attributes ) ), base(), kind( o.kind ) {
+: BaseInstType( o.name, o.qualifiers, copy( o.attributes ) ), base(), kind( o.kind ) {
 	Pass< ForallSubstitutor > sub;
 	initWithSub( o, sub );      // initialize substitution
Index: src/AST/Type.hpp
===================================================================
--- src/AST/Type.hpp	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/AST/Type.hpp	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -329,8 +329,8 @@
 
 /// base class for types that refer to types declared elsewhere (aggregates and typedefs)
-class ReferenceToType : public ParameterizedType {
+class BaseInstType : public ParameterizedType {
 protected:
 	/// Initializes forall and parameters based on substitutor
-	void initWithSub( const ReferenceToType & o, Pass< ForallSubstitutor > & sub );
+	void initWithSub( const BaseInstType & o, Pass< ForallSubstitutor > & sub );
 public:
 	std::vector<ptr<Expr>> params;
@@ -338,9 +338,9 @@
 	bool hoistType = false;
 
-	ReferenceToType(
+	BaseInstType(
 		const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} )
 	: ParameterizedType(q, std::move(as)), params(), name(n) {}
 
-	ReferenceToType( const ReferenceToType & o );
+	BaseInstType( const BaseInstType & o );
 
 	/// Gets aggregate declaration this type refers to
@@ -350,5 +350,5 @@
 
 private:
-	virtual ReferenceToType * clone() const override = 0;
+	virtual BaseInstType * clone() const override = 0;
 	MUTATE_FRIEND
 };
@@ -356,5 +356,5 @@
 // Common implementation for the SUE instance types. Not to be used directly.
 template<typename decl_t>
-class SueInstType final : public ReferenceToType {
+class SueInstType final : public BaseInstType {
 public:
 	using base_type = decl_t;
@@ -363,5 +363,5 @@
 	SueInstType(
 		const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} )
-	: ReferenceToType( n, q, std::move(as) ), base() {}
+	: BaseInstType( n, q, std::move(as) ), base() {}
 
 	SueInstType(
@@ -388,5 +388,5 @@
 
 /// An instance of a trait type.
-class TraitInstType final : public ReferenceToType {
+class TraitInstType final : public BaseInstType {
 public:
 	readonly<TraitDecl> base;
@@ -394,5 +394,5 @@
 	TraitInstType(
 		const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} )
-	: ReferenceToType( n, q, std::move(as) ), base() {}
+	: BaseInstType( n, q, std::move(as) ), base() {}
 
 	TraitInstType(
@@ -411,5 +411,5 @@
 
 /// instance of named type alias (typedef or variable)
-class TypeInstType final : public ReferenceToType {
+class TypeInstType final : public BaseInstType {
 public:
 	readonly<TypeDecl> base;
@@ -419,8 +419,8 @@
 		const std::string& n, const TypeDecl * b, CV::Qualifiers q = {},
 		std::vector<ptr<Attribute>> && as = {} )
-	: ReferenceToType( n, q, std::move(as) ), base( b ), kind( b->kind ) {}
+	: BaseInstType( n, q, std::move(as) ), base( b ), kind( b->kind ) {}
 	TypeInstType( const std::string& n, TypeDecl::Kind k, CV::Qualifiers q = {},
 		std::vector<ptr<Attribute>> && as = {} )
-	: ReferenceToType( n, q, std::move(as) ), base(), kind( k ) {}
+	: BaseInstType( n, q, std::move(as) ), base(), kind( k ) {}
 
 	TypeInstType( const TypeInstType & o );
Index: src/AST/TypeSubstitution.cpp
===================================================================
--- src/AST/TypeSubstitution.cpp	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/AST/TypeSubstitution.cpp	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -176,5 +176,5 @@
 }
 
-void TypeSubstitution::Substituter::handleAggregateType( const ReferenceToType * type ) {
+void TypeSubstitution::Substituter::handleAggregateType( const BaseInstType * type ) {
 	GuardValue( boundVars );
 	// bind type variables from forall-qualifiers
Index: src/AST/TypeSubstitution.hpp
===================================================================
--- src/AST/TypeSubstitution.hpp	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/AST/TypeSubstitution.hpp	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -169,5 +169,5 @@
 		void previsit( const ParameterizedType * type );
 		/// Records type variable bindings from forall-statements and instantiations of generic types
-		void handleAggregateType( const ReferenceToType * type );
+		void handleAggregateType( const BaseInstType * type );
 
 		void previsit( const StructInstType * aggregateUseType );
Index: src/ResolvExpr/CandidateFinder.cpp
===================================================================
--- src/ResolvExpr/CandidateFinder.cpp	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/ResolvExpr/CandidateFinder.cpp	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -816,5 +816,5 @@
 		/// Adds aggregate member interpretations
 		void addAggMembers(
-			const ast::ReferenceToType * aggrInst, const ast::Expr * expr,
+			const ast::BaseInstType * aggrInst, const ast::Expr * expr,
 			const Candidate & cand, const Cost & addedCost, const std::string & name
 		) {
@@ -1263,5 +1263,5 @@
 
 		void postvisit( const ast::UntypedOffsetofExpr * offsetofExpr ) {
-			const ast::ReferenceToType * aggInst;
+			const ast::BaseInstType * aggInst;
 			if (( aggInst = offsetofExpr->type.as< ast::StructInstType >() )) ;
 			else if (( aggInst = offsetofExpr->type.as< ast::UnionInstType >() )) ;
Index: src/ResolvExpr/CurrentObject.cc
===================================================================
--- src/ResolvExpr/CurrentObject.cc	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/ResolvExpr/CurrentObject.cc	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -923,5 +923,5 @@
 
 	MemberIterator * createMemberIterator( const CodeLocation & loc, const Type * type ) {
-		if ( auto aggr = dynamic_cast< const ReferenceToType * >( type ) ) {
+		if ( auto aggr = dynamic_cast< const BaseInstType * >( type ) ) {
 			if ( auto sit = dynamic_cast< const StructInstType * >( aggr ) ) {
 				return new StructIterator{ loc, sit };
@@ -932,5 +932,5 @@
 					dynamic_cast< const EnumInstType * >( type )
 						|| dynamic_cast< const TypeInstType * >( type ),
-					"Encountered unhandled ReferenceToType in createMemberIterator: %s",
+					"Encountered unhandled BaseInstType in createMemberIterator: %s",
 						toString( type ).c_str() );
 				return new SimpleIterator{ loc, type };
@@ -965,5 +965,5 @@
 					DesignatorChain & d = *dit;
 					PRINT( std::cerr << "____actual: " << t << std::endl; )
-					if ( auto refType = dynamic_cast< const ReferenceToType * >( t ) ) {
+					if ( auto refType = dynamic_cast< const BaseInstType * >( t ) ) {
 						// concatenate identical field names
 						for ( const Decl * mem : refType->lookup( nexpr->name ) ) {
Index: src/SymTab/Mangler.cc
===================================================================
--- src/SymTab/Mangler.cc	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/SymTab/Mangler.cc	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -437,5 +437,5 @@
 		  private:
 			void mangleDecl( const ast::DeclWithType *declaration );
-			void mangleRef( const ast::ReferenceToType *refType, std::string prefix );
+			void mangleRef( const ast::BaseInstType *refType, std::string prefix );
 
 			void printQualifiers( const ast::Type *type );
@@ -560,5 +560,5 @@
 		}
 
-		void Mangler_new::mangleRef( const ast::ReferenceToType * refType, std::string prefix ) {
+		void Mangler_new::mangleRef( const ast::BaseInstType * refType, std::string prefix ) {
 			printQualifiers( refType );
 
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision b9fa85b6bb101567c376a002614067feab620b7b)
+++ src/SymTab/Validate.cc	(revision 98e8b3bff3b5c212f4724bd051ba614a77a1be19)
@@ -1508,5 +1508,5 @@
 		}
 
-		void checkGenericParameters( const ast::ReferenceToType * inst ) {
+		void checkGenericParameters( const ast::BaseInstType * inst ) {
 			for ( const ast::Expr * param : inst->params ) {
 				if ( ! dynamic_cast< const ast::TypeExpr * >( param ) ) {
