Index: src/ResolvExpr/ConversionCost.cc
===================================================================
--- src/ResolvExpr/ConversionCost.cc	(revision 1d7b0a8b3222b5be41c98932430124a3777a31a9)
+++ src/ResolvExpr/ConversionCost.cc	(revision 6d53e7792be19347d037650ff7afc2ca3778c35e)
@@ -29,10 +29,12 @@
 
 namespace ResolvExpr {
-	const Cost Cost::zero =      Cost(  0,  0,  0,  0 );
-	const Cost Cost::infinity =  Cost( -1, -1, -1, -1 );
-	const Cost Cost::unsafe =    Cost(  1,  0,  0,  0 );
-	const Cost Cost::poly =      Cost(  0,  1,  0,  0 );
-	const Cost Cost::safe =      Cost(  0,  0,  1,  0 );
-	const Cost Cost::reference = Cost(  0,  0,  0,  1 );
+	const Cost Cost::zero =      Cost{  0,  0,  0,  0,  0,  0 };
+	const Cost Cost::infinity =  Cost{ -1, -1, -1,  1, -1, -1 };
+	const Cost Cost::unsafe =    Cost{  1,  0,  0,  0,  0,  0 };
+	const Cost Cost::poly =      Cost{  0,  1,  0,  0,  0,  0 };
+	const Cost Cost::var =       Cost{  0,  0,  1,  0,  0,  0 };
+	const Cost Cost::spec =      Cost{  0,  0,  0, -1,  0,  0 };
+	const Cost Cost::safe =      Cost{  0,  0,  0,  0,  1,  0 };
+	const Cost Cost::reference = Cost{  0,  0,  0,  0,  0,  1 };
 
 #if 0
Index: src/ResolvExpr/Cost.h
===================================================================
--- src/ResolvExpr/Cost.h	(revision 1d7b0a8b3222b5be41c98932430124a3777a31a9)
+++ src/ResolvExpr/Cost.h	(revision 6d53e7792be19347d037650ff7afc2ca3778c35e)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 09:39:50 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:35:55 2017
-// Update Count     : 5
+// Last Modified By : Aaron B. Moss
+// Last Modified On : Mon Jun 11 16:04:00 2018
+// Update Count     : 6
 //
 
@@ -21,9 +21,11 @@
 	class Cost {
 	  private:
-		Cost( int unsafeCost, int polyCost, int safeCost, int referenceCost );
+		Cost( int unsafeCost, int polyCost, int varCost, int specCost, int safeCost, int referenceCost );
 
 	  public:
 		Cost & incUnsafe( int inc = 1 );
 		Cost & incPoly( int inc = 1 );
+		Cost & incVar( int inc = 1 );
+		Cost & decSpec( int dec = 1 );
 		Cost & incSafe( int inc = 1 );
 		Cost & incReference( int inc = 1 );
@@ -31,4 +33,6 @@
 		int get_unsafeCost() const { return unsafeCost; }
 		int get_polyCost() const { return polyCost; }
+		int get_varCost() const { return varCost; }
+		int get_specCost() const { return specCost; }
 		int get_safeCost() const { return safeCost; }
 		int get_referenceCost() const { return referenceCost; }
@@ -47,16 +51,21 @@
 		static const Cost unsafe;
 		static const Cost poly;
+		static const Cost var;
+		static const Cost spec;
 		static const Cost safe;
 		static const Cost reference;
 	  private:
-		int compare( const Cost &other ) const;
 
-		int unsafeCost;
-		int polyCost;
-		int safeCost;
-		int referenceCost;
+		int unsafeCost;     ///< Unsafe (narrowing) conversions
+		int polyCost;       ///< Count of parameters and return values bound to some poly type
+		int varCost;        ///< Count of polymorphic type variables
+		int specCost;       ///< Polymorphic type specializations (type assertions), negative cost
+		int safeCost;       ///< Safe (widening) conversions
+		int referenceCost;  ///< reference conversions
 	};
 
-	inline Cost::Cost( int unsafeCost, int polyCost, int safeCost, int referenceCost ) : unsafeCost( unsafeCost ), polyCost( polyCost ), safeCost( safeCost ), referenceCost( referenceCost ) {}
+	inline Cost::Cost( 
+		int unsafeCost, int polyCost, int varCost, int specCost, int safeCost, int referenceCost ) : unsafeCost( unsafeCost ), polyCost( polyCost ), varCost( varCost ), specCost( specCost ), 
+		  safeCost( safeCost ), referenceCost( referenceCost ) {}
 
 	inline Cost & Cost::incUnsafe( int inc ) {
@@ -69,4 +78,16 @@
 		if ( *this == infinity ) return *this;
 		polyCost += inc;
+		return *this;
+	}
+
+	inline Cost & Cost::incVar( int inc ) {
+		if ( *this == infinity ) return *this;
+		varCost += inc;
+		return *this;
+	}
+
+	inline Cost& Cost::decSpec( int dec ) {
+		if ( *this == infinity ) return *this;
+		specCost -= dec;
 		return *this;
 	}
@@ -86,10 +107,16 @@
 	inline Cost Cost::operator+( const Cost &other ) const {
 		if ( *this == infinity || other == infinity ) return infinity;
-		return Cost( unsafeCost + other.unsafeCost, polyCost + other.polyCost, safeCost + other.safeCost, referenceCost + other.referenceCost );
+		return Cost( 
+			unsafeCost + other.unsafeCost, polyCost + other.polyCost, 
+			varCost + other.varCost, specCost + other.specCost, 
+			safeCost + other.safeCost, referenceCost + other.referenceCost );
 	}
 
 	inline Cost Cost::operator-( const Cost &other ) const {
 		if ( *this == infinity || other == infinity ) return infinity;
-		return Cost( unsafeCost - other.unsafeCost, polyCost - other.polyCost, safeCost - other.safeCost, referenceCost - other.referenceCost );
+		return Cost( 
+			unsafeCost - other.unsafeCost, polyCost - other.polyCost, 
+			varCost + other.varCost, specCost + other.specCost, 
+			safeCost - other.safeCost, referenceCost - other.referenceCost );
 	}
 
@@ -102,4 +129,6 @@
 		unsafeCost += other.unsafeCost;
 		polyCost += other.polyCost;
+		varCost += other.varCost;
+		specCost += other.specCost;
 		safeCost += other.safeCost;
 		referenceCost += other.referenceCost;
@@ -119,4 +148,12 @@
 		} else if ( polyCost < other.polyCost ) {
 			return true;
+		} else if ( varCost > other.varCost ) {
+			return false;
+		} else if ( varCost < other.varCost ) {
+			return true;
+		} else if ( specCost > other.specCost ) {
+			return false;
+		} else if ( specCost < other.specCost ) {
+			return true;
 		} else if ( safeCost > other.safeCost ) {
 			return false;
@@ -135,4 +172,6 @@
 		return unsafeCost == other.unsafeCost
 			&& polyCost == other.polyCost
+			&& varCost == other.varCost
+			&& specCost == other.specCost
 			&& safeCost == other.safeCost
 			&& referenceCost == other.referenceCost;
@@ -144,6 +183,7 @@
 
 	inline std::ostream &operator<<( std::ostream &os, const Cost &cost ) {
-		os << "( " << cost.unsafeCost << ", " << cost.polyCost << ", " << cost.safeCost << ", " << cost.referenceCost << " )";
-		return os;
+		return os << "( " << cost.unsafeCost << ", " << cost.polyCost << ", " 
+		          << cost.varCost << ", " << cost.specCost << ", "
+		          << cost.safeCost << ", " << cost.referenceCost << " )";
 	}
 } // namespace ResolvExpr
