Index: src/AST/Fwd.hpp
===================================================================
--- src/AST/Fwd.hpp	(revision a8ed717b39d5ce90f3791d32ba7c2cae77882555)
+++ src/AST/Fwd.hpp	(revision 923d25a0481c54f984b2f8571ec487e9042389ca)
@@ -10,6 +10,6 @@
 // Created On       : Wed May  8 16:05:00 2019
 // Last Modified By : Andrew Beach
-// Last Modified On : Mon Jun 24 09:48:00 2019
-// Update Count     : 1
+// Last Modified On : Thr Jul 23 14:15:00 2020
+// Update Count     : 2
 //
 
@@ -108,7 +108,8 @@
 class FunctionType;
 class ReferenceToType;
-class StructInstType;
-class UnionInstType;
-class EnumInstType;
+template<typename decl_t> class SueInstType;
+using StructInstType = SueInstType<StructDecl>;
+using UnionInstType = SueInstType<UnionDecl>;
+using EnumInstType = SueInstType<EnumDecl>;
 class TraitInstType;
 class TypeInstType;
Index: src/AST/Type.cpp
===================================================================
--- src/AST/Type.cpp	(revision a8ed717b39d5ce90f3791d32ba7c2cae77882555)
+++ src/AST/Type.cpp	(revision 923d25a0481c54f984b2f8571ec487e9042389ca)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Mon May 13 15:00:00 2019
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sun Dec 15 16:56:28 2019
-// Update Count     : 4
+// Last Modified By : Andrew Beach
+// Last Modified On : Thu Jul 23 14:16:00 2020
+// Update Count     : 5
 //
 
@@ -148,27 +148,19 @@
 }
 
-// --- StructInstType
-
-StructInstType::StructInstType( 
-	const StructDecl * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as )
+// --- SueInstType (StructInstType, UnionInstType, EnumInstType)
+
+template<typename decl_t>
+SueInstType<decl_t>::SueInstType(
+	const decl_t * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as )
 : ReferenceToType( b->name, q, move(as) ), base( b ) {}
 
-bool StructInstType::isComplete() const { return base ? base->body : false; }
-
-// --- UnionInstType
-
-UnionInstType::UnionInstType( 
-	const UnionDecl * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as )
-: ReferenceToType( b->name, q, move(as) ), base( b ) {}
-
-bool UnionInstType::isComplete() const { return base ? base->body : false; }
-
-// --- EnumInstType
-
-EnumInstType::EnumInstType( 
-	const EnumDecl * b, CV::Qualifiers q, std::vector<ptr<Attribute>>&& as )
-: ReferenceToType( b->name, q, move(as) ), base( b ) {}
-
-bool EnumInstType::isComplete() const { return base ? base->body : false; }
+template<typename decl_t>
+bool SueInstType<decl_t>::isComplete() const {
+	return base ? base->body : false;
+}
+
+template class SueInstType<StructDecl>;
+template class SueInstType<UnionDecl>;
+template class SueInstType<EnumDecl>;
 
 // --- TraitInstType
Index: src/AST/Type.hpp
===================================================================
--- src/AST/Type.hpp	(revision a8ed717b39d5ce90f3791d32ba7c2cae77882555)
+++ src/AST/Type.hpp	(revision 923d25a0481c54f984b2f8571ec487e9042389ca)
@@ -9,7 +9,7 @@
 // Author           : Aaron B. Moss
 // Created On       : Thu May 9 10:00:00 2019
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Wed Dec 11 21:56:46 2019
-// Update Count     : 5
+// Last Modified By : Andrew Beach
+// Last Modified On : Thu Jul 23 14:15:00 2020
+// Update Count     : 6
 //
 
@@ -354,71 +354,38 @@
 };
 
-/// instance of struct type
-class StructInstType final : public ReferenceToType {
-public:
-	readonly<StructDecl> base;
-
-	StructInstType(
+// Common implementation for the SUE instance types. Not to be used directly.
+template<typename decl_t>
+class SueInstType final : public ReferenceToType {
+public:
+	using base_type = decl_t;
+	readonly<decl_t> base;
+
+	SueInstType(
 		const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} )
 	: ReferenceToType( n, q, std::move(as) ), base() {}
 
-	StructInstType(
-		const StructDecl * b, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} );
+	SueInstType(
+		const decl_t * b, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} );
 
 	bool isComplete() const override;
 
-	const StructDecl * aggr() const override { return base; }
-
-	const Type * accept( Visitor & v ) const override { return v.visit( this ); }
-private:
-	StructInstType * clone() const override { return new StructInstType{ *this }; }
-	MUTATE_FRIEND
-};
-
-/// instance of union type
-class UnionInstType final : public ReferenceToType {
-public:
-	readonly<UnionDecl> base;
-
-	UnionInstType(
-		const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} )
-	: ReferenceToType( n, q, std::move(as) ), base() {}
-
-	UnionInstType(
-		const UnionDecl * b, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} );
-
-	bool isComplete() const override;
-
-	const UnionDecl * aggr() const override { return base; }
-
-	const Type * accept( Visitor & v ) const override { return v.visit( this ); }
-private:
-	UnionInstType * clone() const override { return new UnionInstType{ *this }; }
-	MUTATE_FRIEND
-};
-
-/// instance of enum type
-class EnumInstType final : public ReferenceToType {
-public:
-	readonly<EnumDecl> base;
-
-	EnumInstType(
-		const std::string& n, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} )
-	: ReferenceToType( n, q, std::move(as) ), base() {}
-
-	EnumInstType(
-		const EnumDecl * b, CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} );
-
-	bool isComplete() const override;
-
-	const EnumDecl * aggr() const override { return base; }
-
-	const Type * accept( Visitor & v ) const override { return v.visit( this ); }
-private:
-	EnumInstType * clone() const override { return new EnumInstType{ *this }; }
-	MUTATE_FRIEND
-};
-
-/// instance of trait type
+	const decl_t * aggr() const override { return base; }
+
+	const Type * accept( Visitor & v ) const override { return v.visit( this ); }
+private:
+	SueInstType<decl_t> * clone() const override { return new SueInstType<decl_t>{ *this }; }
+	MUTATE_FRIEND
+};
+
+/// An instance of a struct type.
+using StructInstType = SueInstType<StructDecl>;
+
+/// An instance of a union type.
+using UnionInstType = SueInstType<UnionDecl>;
+
+/// An instance of an enum type.
+using EnumInstType = SueInstType<EnumDecl>;
+
+/// An instance of a trait type.
 class TraitInstType final : public ReferenceToType {
 public:
