diff --git a/src/main/scala/leon/codegen/CompilationUnit.scala b/src/main/scala/leon/codegen/CompilationUnit.scala
index 548e2ab000cccc0459245f76a79809669bcc5ffe..799241c5ccefa76c8e0a4fa7e47d033a90d8d313 100644
--- a/src/main/scala/leon/codegen/CompilationUnit.scala
+++ b/src/main/scala/leon/codegen/CompilationUnit.scala
@@ -25,7 +25,7 @@ class CompilationUnit(val program: Program, val classes: Map[Definition, ClassFi
   }.toMap
 
   protected[codegen] val loader = {
-    val l = new CafebabeClassLoader
+    val l = new CafebabeClassLoader(classOf[CompilationUnit].getClassLoader)
     classes.values.foreach(l.register(_))
     l
   }
@@ -72,6 +72,7 @@ class CompilationUnit(val program: Program, val classes: Map[Definition, ClassFi
       compileExpression(e, Seq()).evalToJVM(Seq())
   }
 
+  // Note that this may produce untyped expressions! (typically: sets, maps)
   private[codegen] def jvmToValue(e: AnyRef): Expr = e match {
     case i: Integer =>
       IntLiteral(i.toInt)
diff --git a/src/main/scala/leon/codegen/CompiledExpression.scala b/src/main/scala/leon/codegen/CompiledExpression.scala
index 0ae8f949f253ba305db59543004f29c2d05116a3..02cc93407643cf4fbcaff043b8e9352af2064bc1 100644
--- a/src/main/scala/leon/codegen/CompiledExpression.scala
+++ b/src/main/scala/leon/codegen/CompiledExpression.scala
@@ -18,6 +18,8 @@ class CompiledExpression(unit: CompilationUnit, cf: ClassFile, expression : Expr
   private lazy val cl = unit.loader.loadClass(cf.className)
   private lazy val meth = cl.getMethods()(0)
 
+  private val exprType = expression.getType
+
   protected[codegen] def evalToJVM(args: Seq[Expr]): AnyRef = {
     assert(args.size == argsDecl.size)
 
@@ -29,9 +31,14 @@ class CompiledExpression(unit: CompilationUnit, cf: ClassFile, expression : Expr
   }
 
   // This may throw an exception. We unwrap it if needed.
+  // We also need to reattach a type in some cases (sets, maps).
   def eval(args: Seq[Expr]) : Expr = {
     try {
-      unit.jvmToValue(evalToJVM(args))
+      val result = unit.jvmToValue(evalToJVM(args))
+      if(!result.isTyped) {
+        result.setType(exprType)
+      }
+      result
     } catch {
       case ite : InvocationTargetException => throw ite.getCause()
     }
diff --git a/src/main/scala/leon/evaluators/CodeGenEvaluator.scala b/src/main/scala/leon/evaluators/CodeGenEvaluator.scala
index c9f6bed912c88b5d101027efd0836e1ca6649e85..7202c4ff1575abafceb642d651bbd0afdccc19f8 100644
--- a/src/main/scala/leon/evaluators/CodeGenEvaluator.scala
+++ b/src/main/scala/leon/evaluators/CodeGenEvaluator.scala
@@ -28,6 +28,7 @@ class CodeGenEvaluator(ctx : LeonContext, val unit : CompilationUnit) extends Ev
 
   override def compile(expression : Expr, argorder : Seq[Identifier]) : Option[Seq[Expr]=>EvaluationResult] = {
     import leon.codegen.runtime.LeonCodeGenRuntimeException
+    import leon.codegen.runtime.LeonCodeGenEvaluationException
 
     val ce = unit.compileExpression(expression, argorder)
 
@@ -41,13 +42,8 @@ class CodeGenEvaluator(ctx : LeonContext, val unit : CompilationUnit) extends Ev
         case e : LeonCodeGenRuntimeException =>
           EvaluationFailure(e.getMessage)
 
-        // Required, because the class may be loaded from a different classloader,
-        // and the check above would fail.
-        case t : Throwable if t.getClass.toString.endsWith("LeonCodeGenRuntimeException") => 
-          EvaluationFailure(t.getMessage)
-
-        case t : Throwable if t.getClass.toString.endsWith("LeonCodeGenEvaluationException") => 
-          EvaluationError(t.getMessage)
+        case e : LeonCodeGenEvaluationException =>
+          EvaluationError(e.getMessage)
       }
     })
   }
diff --git a/src/main/scala/leon/purescala/TypeTrees.scala b/src/main/scala/leon/purescala/TypeTrees.scala
index 31906fb14b9316cf406167af096d64962c60ef62..22e1010aeaef831f3957792897d1c639610c8254 100644
--- a/src/main/scala/leon/purescala/TypeTrees.scala
+++ b/src/main/scala/leon/purescala/TypeTrees.scala
@@ -21,6 +21,8 @@ object TypeTrees {
       case Some(o) if o != tt => scala.sys.error("Resetting type information! Type [" + o + "] is modified to [" + tt)
       case _ => this
     }
+
+    def isTyped : Boolean = (getType != Untyped)
   }
 
   class TypeErrorException(msg: String) extends Exception(msg)
diff --git a/unmanaged/common/cafebabe_2.9.2-1.2.jar b/unmanaged/common/cafebabe_2.9.2-1.2.jar
index bd36c4eee8b7548a6bb0e4fba9003597fc5bf2f6..7fdd2eae06df631006abc992f29847c84198f9a4 100644
Binary files a/unmanaged/common/cafebabe_2.9.2-1.2.jar and b/unmanaged/common/cafebabe_2.9.2-1.2.jar differ