Index: src/ResolvExpr/CommonType.cc
===================================================================
--- src/ResolvExpr/CommonType.cc	(revision 00eaeb8994cf3f494e7144b8b16c571570217395)
+++ src/ResolvExpr/CommonType.cc	(revision bbf2cb164e26be1589f185df9bf81b21c503c1d2)
@@ -672,7 +672,20 @@
 
 	void postvisit( const ast::EnumInstType * enumInst ) {
-		if (!dynamic_cast<const ast::EnumInstType *>(type2))
+		// if ( dynamic_cast<const ast::EnumPosType *>(enumInst) ) {
+		// 	result = enumInst;
+		// } else 
+		if (!dynamic_cast<const ast::EnumInstType *>(type2)) {
 			result = commonType( type2, enumInst, tenv, need, have, open, widen);
 		}
+	}
+
+	void postvisit( const ast::EnumPosType * enumPos ) {
+		if ( auto type2AsPos = dynamic_cast<const ast::EnumPosType *>(type2) ) {
+			// result = commonType( type2AsPos->instance, enumPos->instance, tenv, need, have, open, widen );
+			result = enumPos;
+		} else if (  auto typeAsBasic = dynamic_cast<const ast::BasicType *>(type2) ) {
+			result = type2;
+		}
+	}
 
 	void postvisit( const ast::TraitInstType * ) {}
Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision 00eaeb8994cf3f494e7144b8b16c571570217395)
+++ src/ResolvExpr/ConversionCost.cc	(revision bbf2cb164e26be1589f185df9bf81b21c503c1d2)
@@ -366,5 +366,5 @@
 }
 
-void ConversionCost::postvisit( const ast::EnumInstType * ) {
+void ConversionCost::postvisit( const ast::EnumInstType * inst ) {
 	static ast::ptr<ast::BasicType> integer = { new ast::BasicType( ast::BasicType::SignedInt ) };
 	cost = costCalc( integer, dst, srcIsLvalue, symtab, env );
@@ -374,9 +374,15 @@
 }
 
-void ConversionCost::postvisit( const ast::EnumPosType * ) {
-	if ( dynamic_cast<const ast::EnumPosType *>( dst ) ) {
-		// Tempoarary
-		cost = Cost::zero;
-	} else {
+void ConversionCost::postvisit( const ast::EnumPosType * src ) {
+	if ( auto dstBase = dynamic_cast<const ast::EnumPosType *>( dst ) ) {
+		// cost = costCalc( src->instance, dstBase->instance, srcIsLvalue, symtab, env );
+		// if ( cost < Cost::unsafe ) cost.incSafe();
+		cost = Cost::zero;
+	} 
+	// if ( auto dstBase = dynamic_cast<const ast::EnumInstType *>( dst ) ) {
+	// 	cost = costCalc( src->instance, dstBase, srcIsLvalue, symtab, env );
+	// 	if ( cost < Cost::unsafe ) cost.incSafe();
+	// } 
+	else {
 		static ast::ptr<ast::BasicType> integer = { new ast::BasicType( ast::BasicType::SignedInt ) };
 		cost = costCalc( integer, dst, srcIsLvalue, symtab, env );
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision 00eaeb8994cf3f494e7144b8b16c571570217395)
+++ src/ResolvExpr/Unify.cc	(revision bbf2cb164e26be1589f185df9bf81b21c503c1d2)
@@ -518,6 +518,7 @@
 
 		void postvisit( const ast::EnumPosType * ) {
-			// Does nothing for now. Handled in ReplacePseudoFunc
-			// Might move here in the future
+			// Lazy approach for now
+			auto otherPos = dynamic_cast< const ast::EnumPosType *>(type2);
+			if (otherPos) this->result = otherPos;
 		}
 
