Index: src/ResolvExpr/CandidateFinder.cpp
===================================================================
--- src/ResolvExpr/CandidateFinder.cpp	(revision ffec1bfd5e6f76604c43a28508c5ddcc64bd3218)
+++ src/ResolvExpr/CandidateFinder.cpp	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
@@ -897,15 +897,15 @@
 						}
 
-						if (argType.as<ast::PointerType>()) funcFinder.otypeKeys.insert(Mangle::Encoding::pointer);
-						else if (const ast::EnumInstType * enumInst = argType.as<ast::EnumInstType>()) {
-							const ast::EnumDecl * enumDecl = enumInst->base;
-							if ( const ast::Type* enumType = enumDecl->base ) {
-								// instance of enum (T) is a instance of type (T) 
-								funcFinder.otypeKeys.insert(Mangle::mangle(enumType, Mangle::NoGenericParams | Mangle::Type));
-							} else {
-								// instance of an untyped enum is techically int
-								funcFinder.otypeKeys.insert(Mangle::mangle(enumDecl, Mangle::NoGenericParams | Mangle::Type));
-							}
-						} 
+						if (argType.as<ast::PointerType>()) funcFinder.otypeKeys.insert(Mangle::Encoding::pointer);						
+						// else if (const ast::EnumInstType * enumInst = argType.as<ast::EnumInstType>()) {
+						// 	const ast::EnumDecl * enumDecl = enumInst->base; // Here
+						// 	if ( const ast::Type* enumType = enumDecl->base ) {
+						// 		// instance of enum (T) is a instance of type (T) 
+						// 		funcFinder.otypeKeys.insert(Mangle::mangle(enumType, Mangle::NoGenericParams | Mangle::Type));
+						// 	} else {
+						// 		// instance of an untyped enum is techically int
+						// 		funcFinder.otypeKeys.insert(Mangle::mangle(enumDecl, Mangle::NoGenericParams | Mangle::Type));
+						// 	}
+						// }
 						else funcFinder.otypeKeys.insert(Mangle::mangle(argType, Mangle::NoGenericParams | Mangle::Type));
 					}
Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision ffec1bfd5e6f76604c43a28508c5ddcc64bd3218)
+++ src/ResolvExpr/ConversionCost.cc	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
@@ -695,4 +695,5 @@
 	if ( const ast::Type * baseType = baseEnum->base ) {
 		cost = costCalc( baseType, dst, srcIsLvalue, symtab, env );
+		// cost = Cost::safe;
 	} else {
 		(void)enumInstType;
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision ffec1bfd5e6f76604c43a28508c5ddcc64bd3218)
+++ src/ResolvExpr/Unify.cc	(revision def751fb5e94c970d065746c20eda0539c4b38ef)
@@ -165,4 +165,18 @@
 		ast::Type * newFirst  = shallowCopy( first  );
 		ast::Type * newSecond = shallowCopy( second );
+		if ( auto temp = dynamic_cast<const ast::EnumInstType *>(first) ) {
+			if ( !dynamic_cast< const ast::EnumInstType * >( second ) ) {
+				const ast::EnumDecl * baseEnum = dynamic_cast<const ast::EnumDecl *>(temp->base.get());
+				if ( auto t = baseEnum->base.get() ) {
+					newFirst = ast::shallowCopy( t );
+				}
+			}
+		} else if ( auto temp = dynamic_cast<const ast::EnumInstType *>(second) ) {
+			const ast::EnumDecl * baseEnum = dynamic_cast<const ast::EnumDecl *>(temp->base.get());
+			if ( auto t = baseEnum->base.get() ) {
+				newSecond = ast::shallowCopy( t );
+			}
+		}
+
 		newFirst ->qualifiers = {};
 		newSecond->qualifiers = {};
@@ -988,5 +1002,5 @@
 				if ( isTuple && isTuple2 ) {
 					++it; ++jt;  // skip ttype parameters before break
-				} else if ( isTuple ) {
+				} else if ( isTuple ) { 
 					// bundle remaining params into tuple
 					pty2 = tupleFromExprs( param2, jt, params2.end(), pty->qualifiers );
