diff --git a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala
index 37f233b741c937e90b19babf8ef13b6b8d2c176f..bee85f77dd6e619de01ed97ca5f09f1de813b0ca 100644
--- a/src/main/scala/leon/frontends/scalac/ASTExtractors.scala
+++ b/src/main/scala/leon/frontends/scalac/ASTExtractors.scala
@@ -32,13 +32,12 @@ trait ASTExtractors {
   protected lazy val optionClassSym     = classFromName("scala.Option")
   protected lazy val arraySym           = classFromName("scala.Array")
   protected lazy val someClassSym       = classFromName("scala.Some")
-  protected lazy val function1TraitSym  = classFromName("scala.Function1")
-  protected lazy val function2TraitSym  = classFromName("scala.Function2")
-  protected lazy val function3TraitSym  = classFromName("scala.Function3")
-  protected lazy val function4TraitSym  = classFromName("scala.Function4")
-  protected lazy val function5TraitSym  = classFromName("scala.Function5")
   protected lazy val byNameSym          = classFromName("scala.<byname>")
   protected lazy val bigIntSym          = classFromName("scala.math.BigInt")
+  protected def functionTraitSym(i:Int) = {
+    require(1 <= i && i <= 22)
+    classFromName("scala.Function" + i)
+  }
 
   def isTuple2(sym : Symbol) : Boolean = sym == tuple2Sym
   def isTuple3(sym : Symbol) : Boolean = sym == tuple3Sym
@@ -82,11 +81,8 @@ trait ASTExtractors {
     sym == optionClassSym || sym == someClassSym
   }
 
-  def isFunction1(sym : Symbol) : Boolean = sym == function1TraitSym
-  def isFunction2(sym : Symbol) : Boolean = sym == function2TraitSym
-  def isFunction3(sym : Symbol) : Boolean = sym == function3TraitSym
-  def isFunction4(sym : Symbol) : Boolean = sym == function4TraitSym
-  def isFunction5(sym : Symbol) : Boolean = sym == function5TraitSym
+  def isFunction(sym : Symbol, i: Int) : Boolean =
+    1 <= i && i <= 22 && sym == functionTraitSym(i)
 
   protected lazy val multisetTraitSym  = try {
       classFromName("scala.collection.immutable.Multiset")
diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
index 101e572ee83f3d41c1978e385730e98453615e2b..362b225ce37d041255d867407f9eab159fbeca60 100644
--- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
+++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
@@ -1849,20 +1849,11 @@ trait CodeExtraction extends ASTExtractors {
       case TypeRef(_, sym, btt :: Nil) if isArrayClassSym(sym) =>
         ArrayType(extractType(btt))
 
-      case TypeRef(_, sym, List(f1,to)) if isFunction1(sym) =>
-        FunctionType(Seq(extractType(f1)), extractType(to))
-
-      case TypeRef(_, sym, List(f1,f2,to)) if isFunction2(sym) =>
-        FunctionType(Seq(extractType(f1),extractType(f2)), extractType(to))
-
-      case TypeRef(_, sym, List(f1,f2,f3,to)) if isFunction3(sym) =>
-        FunctionType(Seq(extractType(f1),extractType(f2),extractType(f3)), extractType(to))
-
-      case TypeRef(_, sym, List(f1,f2,f3,f4,to)) if isFunction4(sym) =>
-        FunctionType(Seq(extractType(f1),extractType(f2),extractType(f3),extractType(f4)), extractType(to))
-
-      case TypeRef(_, sym, List(f1,f2,f3,f4,f5,to)) if isFunction5(sym) =>
-        FunctionType(Seq(extractType(f1),extractType(f2),extractType(f3),extractType(f4),extractType(f5)), extractType(to))
+      // TODO: What about Function0?
+      case TypeRef(_, sym, subs) if subs.size > 1 && isFunction(sym, subs.size - 1) =>
+        val from = subs.init
+        val to   = subs.last
+        FunctionType(from map extractType, extractType(to))
 
       case TypeRef(_, sym, tps) if isByNameSym(sym) =>
         extractType(tps.head)