Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 3e5439987bdaca8e3f69edabd5a99bb0e41316b1)
+++ src/AST/Convert.cpp	(revision f238fcc2eafd0e0a792e3db3f23ab47e63d45c2b)
@@ -1496,6 +1496,4 @@
 		getAccept1< ast::type, decltype( old->child ) >( old->child )
 
-#	define GET_ACCEPT_E(child, type) \
-		getAccept1< ast::type, decltype( old->base ) >( old->base )
 
 	template<typename NewT, typename OldC>
@@ -1513,4 +1511,7 @@
 #	define GET_ACCEPT_V(child, type) \
 		getAcceptV< ast::type, decltype( old->child ) >( old->child )
+
+#	define GET_ACCEPT_E(child, type) \
+		getAccept1< ast::type, decltype( old->base ) >( old->base )
 
 	template<typename NewT, typename OldC>
@@ -1714,5 +1715,4 @@
 	}
 
-	// Marker
 	// Convert SynTree::EnumDecl to AST::EnumDecl
 	virtual void visit( const EnumDecl * old ) override final {
@@ -1723,5 +1723,5 @@
 			GET_ACCEPT_V(attributes, Attribute),
 			{ old->linkage.val },
-			old->base? GET_ACCEPT_E(base, Type) : nullptr,
+			GET_ACCEPT_1(base, Type),
 			old->enumValues
 		);
Index: src/CodeGen/GenType.cc
===================================================================
--- src/CodeGen/GenType.cc	(revision 3e5439987bdaca8e3f69edabd5a99bb0e41316b1)
+++ src/CodeGen/GenType.cc	(revision f238fcc2eafd0e0a792e3db3f23ab47e63d45c2b)
@@ -253,6 +253,14 @@
 
 	void GenType::postvisit( EnumInstType * enumInst ) {
-		typeString = enumInst->name + " " + typeString;
-		if ( options.genC ) typeString = "enum " + typeString;
+		if ( enumInst->baseEnum->base 
+		&& dynamic_cast<BasicType *>(enumInst->baseEnum->base)
+		&& dynamic_cast<BasicType *>(enumInst->baseEnum->base)->kind != BasicType::Kind::SignedInt) {
+			typeString = genType(enumInst->baseEnum->base, "", options) + typeString;
+		} else {
+			typeString = enumInst->name + " " + typeString;
+			if ( options.genC ) {
+				typeString = "enum " + typeString;
+			} 
+		} 
 		handleQualifiers( enumInst );
 	}
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision 3e5439987bdaca8e3f69edabd5a99bb0e41316b1)
+++ src/Parser/TypeData.cc	(revision f238fcc2eafd0e0a792e3db3f23ab47e63d45c2b)
@@ -918,7 +918,7 @@
 EnumDecl * buildEnum( const TypeData * td, std::list< Attribute * > attributes, LinkageSpec::Spec linkage ) {
 	assert( td->kind == TypeData::Enum );
-	Type* baseType = td->base ? typebuild(td->base) : nullptr;
+	Type * baseType = td->base ? typebuild(td->base) : nullptr;
 	EnumDecl * ret = new EnumDecl( *td->enumeration.name, attributes, linkage, baseType );
-	buildList( td->enumeration.constants, ret->get_members() ); // enumConstant is both a node and a list
+	buildList( td->enumeration.constants, ret->get_members() );
 	list< Declaration * >::iterator members = ret->get_members().begin();
 	for ( const DeclarationNode * cur = td->enumeration.constants; cur != nullptr; cur = dynamic_cast< DeclarationNode * >( cur->get_next() ), ++members ) {
@@ -926,4 +926,8 @@
 			ObjectDecl * member = dynamic_cast< ObjectDecl * >(* members);
 			member->set_init( new SingleInit( maybeMoveBuild< Expression >( cur->consume_enumeratorValue() ) ) );
+		} else {
+			if ( baseType && (!dynamic_cast<BasicType *>(baseType) || !dynamic_cast<BasicType *>(baseType)->isWholeNumber())) {
+				SemanticError( td->location, "A non whole number enum value decl must be explicitly initialized." );
+			}
 		} // if
 	} // for
Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision 3e5439987bdaca8e3f69edabd5a99bb0e41316b1)
+++ src/ResolvExpr/ConversionCost.cc	(revision f238fcc2eafd0e0a792e3db3f23ab47e63d45c2b)
@@ -333,5 +333,11 @@
 		} else if ( dynamic_cast< const EnumInstType * >( dest ) ) {
 			// xxx - not positive this is correct, but appears to allow casting int => enum
-			cost = Cost::unsafe;
+			// TODO
+			EnumDecl * decl = dynamic_cast< const EnumInstType * >( dest )->baseEnum;
+			if ( decl->base ) {
+				cost = Cost::infinity;
+			} else {
+				cost = Cost::unsafe;
+			} // if
 		} // if
 		// no cases for zero_t/one_t because it should not be possible to convert int, etc. to zero_t/one_t.
@@ -610,5 +616,10 @@
 	} else if ( dynamic_cast< const ast::EnumInstType * >( dst ) ) {
 		// xxx - not positive this is correct, but appears to allow casting int => enum
-		cost = Cost::unsafe;
+		const ast::EnumDecl * decl = (dynamic_cast< const ast::EnumInstType * >( dst ))->base.get();
+		if ( decl->base ) {
+			cost = Cost::infinity;
+		} else {
+			cost = Cost::unsafe;
+		} // if
 	}
 }
Index: src/SynTree/BasicType.cc
===================================================================
--- src/SynTree/BasicType.cc	(revision 3e5439987bdaca8e3f69edabd5a99bb0e41316b1)
+++ src/SynTree/BasicType.cc	(revision f238fcc2eafd0e0a792e3db3f23ab47e63d45c2b)
@@ -29,4 +29,21 @@
 }
 
+bool BasicType::isWholeNumber() const {
+	return kind == Bool || 
+		kind ==Char ||
+		kind == SignedChar ||
+		kind == UnsignedChar ||
+		kind == ShortSignedInt ||
+		kind == ShortUnsignedInt ||
+		kind == SignedInt ||
+		kind == UnsignedInt ||
+		kind == LongSignedInt ||
+		kind == LongUnsignedInt ||
+		kind == LongLongSignedInt ||
+		kind ==LongLongUnsignedInt ||
+		kind == SignedInt128 ||
+		kind == UnsignedInt128;
+}
+
 bool BasicType::isInteger() const {
 	return kind <= UnsignedInt128;
Index: src/SynTree/Type.h
===================================================================
--- src/SynTree/Type.h	(revision 3e5439987bdaca8e3f69edabd5a99bb0e41316b1)
+++ src/SynTree/Type.h	(revision f238fcc2eafd0e0a792e3db3f23ab47e63d45c2b)
@@ -268,5 +268,5 @@
 	virtual Type *acceptMutator( Mutator & m ) override { return m.mutate( this ); }
 	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
-
+	bool isWholeNumber() const;
 	bool isInteger() const;
 };
