Index: src/CodeGen/GenType.cc
===================================================================
--- src/CodeGen/GenType.cc	(revision e6cf857ff39724482e399cbcb2a9231afb662b65)
+++ src/CodeGen/GenType.cc	(revision 373aad760273872fddca861a394d29df7f2c0882)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Wed May  1 15:24:00 2019
-// Update Count     : 23
+// Last Modified On : Fri May 20 11:18:00 2022
+// Update Count     : 24
 //
 #include "GenType.h"
@@ -50,4 +50,5 @@
 		void postvisit( TraitInstType * inst );
 		void postvisit( TypeofType * typeof );
+		void postvisit( VTableType * vtable );
 		void postvisit( QualifiedType * qualType );
 
@@ -259,10 +260,11 @@
 			if ( options.genC ) {
 				typeString = "enum " + typeString;
-			} 
-		} 
+			}
+		}
 		handleQualifiers( enumInst );
 	}
 
 	void GenType::postvisit( TypeInstType * typeInst ) {
+		assertf( ! options.genC, "Type instance types should not reach code generation." );
 		typeString = typeInst->name + " " + typeString;
 		handleQualifiers( typeInst );
@@ -320,4 +322,12 @@
 	}
 
+	void GenType::postvisit( VTableType * vtable ) {
+		assertf( ! options.genC, "Virtual table types should not reach code generation." );
+		std::ostringstream os;
+		os << "vtable(" << genType( vtable->base, "", options ) << ") " << typeString;
+		typeString = os.str();
+		handleQualifiers( vtable );
+	}
+
 	void GenType::postvisit( QualifiedType * qualType ) {
 		assertf( ! options.genC, "Qualified types should not reach code generation." );
Index: src/ControlStruct/ExceptDecl.cc
===================================================================
--- src/ControlStruct/ExceptDecl.cc	(revision e6cf857ff39724482e399cbcb2a9231afb662b65)
+++ src/ControlStruct/ExceptDecl.cc	(revision 373aad760273872fddca861a394d29df7f2c0882)
@@ -9,7 +9,7 @@
 // Author           : Henry Xue
 // Created On       : Tue Jul 20 04:10:50 2021
-// Last Modified By : Henry Xue
-// Last Modified On : Tue Aug 03 10:42:26 2021
-// Update Count     : 4
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed May 25 16:43:00 2022
+// Update Count     : 5
 //
 
@@ -39,12 +39,11 @@
 }
 
-TypeInstType * makeExceptInstType(
-	const std::string & exceptionName,
-	const std::list< Expression *> & parameters
-) {
-	TypeInstType * exceptInstType = new TypeInstType(
+StructInstType * makeExceptInstType(
+	const std::string & exceptionName,
+	const std::list< Expression *> & parameters
+) {
+	StructInstType * exceptInstType = new StructInstType(
 		noQualifiers,
-		exceptionName,
-		false
+		exceptionName
 	);
 	cloneAll( parameters, exceptInstType->parameters );
@@ -151,5 +150,5 @@
 		nullptr,
 		new PointerType( noQualifiers,
-			new TypeInstType( Type::Const, "__cfavir_type_info", false ) ),
+			new StructInstType( Type::Const, "__cfavir_type_info" ) ),
 		nullptr
 	) );
@@ -257,5 +256,5 @@
 	const std::string & exceptionName,
 	const std::list< TypeDecl *> & forallClause,
-	const std::list< Expression *> & parameters, 
+	const std::list< Expression *> & parameters,
 	const std::list< Declaration *> & members
 ) {
@@ -302,5 +301,5 @@
 ObjectDecl * ehmExternVtable(
 	const std::string & exceptionName,
-	const std::list< Expression *> & parameters, 
+	const std::list< Expression *> & parameters,
 	const std::string & tableName
 ) {
@@ -457,8 +456,27 @@
 }
 
+class VTableCore : public WithDeclsToAdd {
+public:
+	// Remove any remaining vtable type nodes in the tree.
+	Type * postmutate( VTableType * vtableType );
+};
+
+Type * VTableCore::postmutate( VTableType * vtableType ) {
+	auto inst = strict_dynamic_cast<ReferenceToType *>( vtableType->base );
+
+	std::string vtableName = Virtual::vtableTypeName( inst->name );
+	StructInstType * newType = new StructInstType( noQualifiers, vtableName );
+	cloneAll( inst->parameters, newType->parameters );
+
+	delete vtableType;
+	return newType;
+}
+
 void translateExcept( std::list< Declaration *> & translationUnit ) {
 	PassVisitor<ExceptDeclCore> translator;
 	mutateAll( translationUnit, translator );
-}
-
-}
+	PassVisitor<VTableCore> typeTranslator;
+	mutateAll( translationUnit, typeTranslator );
+}
+
+}
