Index: src/ResolvExpr/CandidateFinder.cpp
===================================================================
--- src/ResolvExpr/CandidateFinder.cpp	(revision 3233b91b36dc8cf1126178068a300f99697b4dec)
+++ src/ResolvExpr/CandidateFinder.cpp	(revision 361bf012e550db91b38f772bfbc7cb7ed2e49033)
@@ -220,5 +220,5 @@
 
 	void makeUnifiableVars(
-		const ast::ParameterizedType * type, ast::OpenVarSet & unifiableVars,
+		const ast::FunctionType * type, ast::OpenVarSet & unifiableVars,
 		ast::AssertionSet & need
 	) {
Index: src/ResolvExpr/CastCost.cc
===================================================================
--- src/ResolvExpr/CastCost.cc	(revision 3233b91b36dc8cf1126178068a300f99697b4dec)
+++ src/ResolvExpr/CastCost.cc	(revision 361bf012e550db91b38f772bfbc7cb7ed2e49033)
@@ -165,5 +165,5 @@
 				} else {
 					ast::TypeEnvironment newEnv{ env };
-					if ( auto wParams = pointerType->base.as< ast::ParameterizedType >() ) {
+					if ( auto wParams = pointerType->base.as< ast::FunctionType >() ) {
 						newEnv.add( wParams->forall );
 					}
Index: src/ResolvExpr/RenameVars.cc
===================================================================
--- src/ResolvExpr/RenameVars.cc	(revision 3233b91b36dc8cf1126178068a300f99697b4dec)
+++ src/ResolvExpr/RenameVars.cc	(revision 361bf012e550db91b38f772bfbc7cb7ed2e49033)
@@ -93,6 +93,5 @@
 		}
 
-		template<typename NodeT>
-		const NodeT * openLevel( const NodeT * type ) {
+		const ast::FunctionType * openLevel( const ast::FunctionType * type ) {
 			if ( type->forall.empty() ) return type;
 
@@ -100,7 +99,8 @@
 
 			// Load new names from this forall clause and perform renaming.
-			NodeT * mutType = ast::mutate( type );
+			auto mutType = ast::mutate( type );
 			assert( type == mutType && "mutated type must be unique from ForallSubstitutor" );
 			for ( ast::ptr< ast::TypeDecl > & td : mutType->forall ) {
+				assertf(dynamic_cast<ast::FunctionType *>(mutType), "renaming vars in non-function type");
 				std::ostringstream output;
 				output << "_" << resetCount << "_" << level << "_" << td->name;
@@ -119,5 +119,5 @@
 		}
 
-		void closeLevel( const ast::ParameterizedType * type ) {
+		void closeLevel( const ast::FunctionType * type ) {
 			if ( type->forall.empty() ) return;
 
@@ -149,4 +149,6 @@
 			return renaming.openLevel( type );
 		}
+
+		/*
 		const ast::StructInstType * previsit( const ast::StructInstType * type ) {
 			return renaming.openLevel( type );
@@ -158,8 +160,10 @@
 			return renaming.openLevel( type );
 		}
+		*/
+
 		const ast::TypeInstType * previsit( const ast::TypeInstType * type ) {
-			return renaming.rename( renaming.openLevel( type ) );
+			return renaming.rename( type );
 		}
-		void postvisit( const ast::ParameterizedType * type ) {
+		void postvisit( const ast::FunctionType * type ) {
 			renaming.closeLevel( type );
 		}
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 3233b91b36dc8cf1126178068a300f99697b4dec)
+++ src/ResolvExpr/Resolver.cc	(revision 361bf012e550db91b38f772bfbc7cb7ed2e49033)
@@ -976,6 +976,11 @@
 			}
 
-			void previsit( const ast::Expr * ) {
+			void previsit( const ast::Expr * expr ) {
 				if ( result ) { visit_children = false; }
+				if (expr->inferred.hasParams()) {
+					for (auto & imp : expr->inferred.inferParams() ) {
+						previsit(imp.second.expr);
+					}
+				}
 			}
 		};
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision 3233b91b36dc8cf1126178068a300f99697b4dec)
+++ src/ResolvExpr/Unify.cc	(revision 361bf012e550db91b38f772bfbc7cb7ed2e49033)
@@ -898,5 +898,5 @@
 		static void markAssertions(
 			ast::AssertionSet & assn1, ast::AssertionSet & assn2,
-			const ast::ParameterizedType * type
+			const ast::FunctionType * type
 		) {
 			for ( const auto & tyvar : type->forall ) {
