Index: src/AST/Decl.cpp
===================================================================
--- src/AST/Decl.cpp	(revision 857b5f94b11520c80efa84eab7d4104469b9e9da)
+++ src/AST/Decl.cpp	(revision 90e683bd043dbecee5fc34eec99bc3d53f59d082)
@@ -169,8 +169,4 @@
 }
 
-bool EnumDecl::isTyped() const { return base; }
-
-bool EnumDecl::isOpaque() const { return isCfa && !isTyped(); }
-
 }
 
Index: src/AST/Decl.hpp
===================================================================
--- src/AST/Decl.hpp	(revision 857b5f94b11520c80efa84eab7d4104469b9e9da)
+++ src/AST/Decl.hpp	(revision 90e683bd043dbecee5fc34eec99bc3d53f59d082)
@@ -306,5 +306,5 @@
 enum class EnumAttribute{ Value, Posn, Label };
 
-/// enum declaration `enum Foo { ... };`
+/// enum declaration `enum Foo { ... };` or `enum(...) Foo { ... };`
 class EnumDecl final : public AggregateDecl {
 public:
@@ -317,4 +317,8 @@
 	std::vector< ast::ptr<ast::EnumInstType>> inlinedDecl; // child enums
 
+	bool is_c_enum     () const { return !isCfa; }
+	bool is_opaque_enum() const { return isCfa && nullptr == base; }
+	bool is_typed_enum () const { return isCfa && nullptr != base; }
+
 	EnumDecl( const CodeLocation& loc, const std::string& name, bool isCfa = false,
 		std::vector<ptr<Attribute>>&& attrs = {}, Linkage::Spec linkage = Linkage::Cforall,
@@ -331,6 +335,4 @@
 	const char * typeString() const override { return aggrString( Enum ); }
 
-	bool isTyped() const;
-	bool isOpaque() const;
 private:
 	EnumDecl * clone() const override { return new EnumDecl{ *this }; }
Index: src/AST/Util.cpp
===================================================================
--- src/AST/Util.cpp	(revision 857b5f94b11520c80efa84eab7d4104469b9e9da)
+++ src/AST/Util.cpp	(revision 90e683bd043dbecee5fc34eec99bc3d53f59d082)
@@ -85,4 +85,11 @@
 	// Check that `type->returns` corresponds with `decl->returns`.
 	assert( type->returns.size() == decl->returns.size() );
+}
+
+/// Check that an enumeration has not been made with an inconsistent spec.
+void isEnumerationConsistent( const EnumDecl * node ) {
+	if ( node->is_c_enum() ) {
+		assert( nullptr == node->base );
+	}
 }
 
@@ -135,4 +142,9 @@
 		previsit( (const ParseNode *)node );
 		functionDeclMatchesType( node );
+	}
+
+	void previsit( const EnumDecl * node ) {
+		previsit( (const ParseNode *)node );
+		isEnumerationConsistent( node );
 	}
 
