diff --git a/src/main/scala/leon/codegen/CodeGeneration.scala b/src/main/scala/leon/codegen/CodeGeneration.scala
index f8a062e6f9d68613cea9030dce53897b07b7fa72..bfe23c143f4fcac4f1ccdf67e27a8099d1bb546e 100644
--- a/src/main/scala/leon/codegen/CodeGeneration.scala
+++ b/src/main/scala/leon/codegen/CodeGeneration.scala
@@ -57,6 +57,7 @@ trait CodeGeneration {
     def apply(isStatic : Boolean) = new Locals(Map(), Map(), Map(), isStatic)
   }
 
+  private[codegen] val ObjectClass               = "java/lang/Object"
   private[codegen] val BoxedIntClass             = "java/lang/Integer"
   private[codegen] val BoxedBoolClass            = "java/lang/Boolean"
   private[codegen] val BoxedCharClass            = "java/lang/Character"
@@ -115,7 +116,7 @@ trait CodeGeneration {
       "[" + typeToJVM(base)
 
     case TypeParameter(_) =>
-      "Ljava/lang/Object;"
+      s"L$ObjectClass;"
 
     case _ => throw CompilationException("Unsupported type : " + tpe)
   }
@@ -281,20 +282,20 @@ trait CodeGeneration {
       case Tuple(es) =>
         ch << New(TupleClass) << DUP
         ch << Ldc(es.size)
-        ch << NewArray("java/lang/Object")
+        ch << NewArray(s"$ObjectClass")
         for((e,i) <- es.zipWithIndex) {
           ch << DUP
           ch << Ldc(i)
           mkBoxedExpr(e, ch)
           ch << AASTORE
         }
-        ch << InvokeSpecial(TupleClass, constructorName, "([Ljava/lang/Object;)V")
+        ch << InvokeSpecial(TupleClass, constructorName, s"([L$ObjectClass;)V")
 
       case TupleSelect(t, i) =>
         val TupleType(bs) = t.getType
         mkExpr(t,ch)
         ch << Ldc(i - 1)
-        ch << InvokeVirtual(TupleClass, "get", "(I)Ljava/lang/Object;")
+        ch << InvokeVirtual(TupleClass, "get", s"(I)L$ObjectClass;")
         mkUnbox(bs(i - 1), ch)
 
       // Sets
@@ -303,13 +304,13 @@ trait CodeGeneration {
         for(e <- es) {
           ch << DUP
           mkBoxedExpr(e, ch)
-          ch << InvokeVirtual(SetClass, "add", "(Ljava/lang/Object;)V")
+          ch << InvokeVirtual(SetClass, "add", s"(L$ObjectClass;)V")
         }
 
       case ElementOfSet(e, s) =>
         mkExpr(s, ch)
         mkBoxedExpr(e, ch)
-        ch << InvokeVirtual(SetClass, "contains", "(Ljava/lang/Object;)Z")
+        ch << InvokeVirtual(SetClass, "contains", s"(L$ObjectClass;)Z")
 
       case SetCardinality(s) =>
         mkExpr(s, ch)
@@ -342,20 +343,20 @@ trait CodeGeneration {
           ch << DUP
           mkBoxedExpr(f, ch)
           mkBoxedExpr(t, ch)
-          ch << InvokeVirtual(MapClass, "add", "(Ljava/lang/Object;Ljava/lang/Object;)V")
+          ch << InvokeVirtual(MapClass, "add", s"(L$ObjectClass;L$ObjectClass;)V")
         }
 
       case MapGet(m, k) =>
         val MapType(_, tt) = m.getType
         mkExpr(m, ch)
         mkBoxedExpr(k, ch)
-        ch << InvokeVirtual(MapClass, "get", "(Ljava/lang/Object;)Ljava/lang/Object;")
+        ch << InvokeVirtual(MapClass, "get", s"(L$ObjectClass;)L$ObjectClass;")
         mkUnbox(tt, ch)
 
       case MapIsDefinedAt(m, k) =>
         mkExpr(m, ch)
         mkBoxedExpr(k, ch)
-        ch << InvokeVirtual(MapClass, "isDefinedAt", "(Ljava/lang/Object;)Z")
+        ch << InvokeVirtual(MapClass, "isDefinedAt", s"(L$ObjectClass;)Z")
 
       case MapUnion(m1, m2) =>
         mkExpr(m1, ch)
@@ -397,7 +398,6 @@ trait CodeGeneration {
         
       case FunctionInvocation(TypedFunDef(fd, Seq(tp)), Seq(set)) if fd == program.library.setToList.get =>
 
-        val ObjectClass = "java/lang/Object"
         val IteratorClass = "java/util/Iterator"
         val nil = CaseClass(CaseClassType(program.library.Nil.get, Seq(tp)), Seq())
         val cons = program.library.Cons.get
@@ -532,14 +532,14 @@ trait CodeGeneration {
 
       case app @ Application(caller, args) =>
         mkExpr(caller, ch)
-        ch << Ldc(args.size) << NewArray("java/lang/Object")
+        ch << Ldc(args.size) << NewArray(s"$ObjectClass")
         for ((arg,i) <- args.zipWithIndex) {
           ch << DUP << Ldc(i)
           mkBoxedExpr(arg, ch)
           ch << AASTORE
         }
 
-        ch << InvokeVirtual(LambdaClass, "apply", "([Ljava/lang/Object;)Ljava/lang/Object;")
+        ch << InvokeVirtual(LambdaClass, "apply", s"([L$ObjectClass;)L$ObjectClass;")
         mkUnbox(app.getType, ch)
 
       case l @ Lambda(args, body) =>
@@ -590,7 +590,7 @@ trait CodeGeneration {
 
         locally {
 
-          val apm = cf.addMethod("Ljava/lang/Object;", "apply", "[Ljava/lang/Object;")
+          val apm = cf.addMethod(s"L$ObjectClass;", "apply", s"[L$ObjectClass;")
 
           apm.setFlags((
             METHOD_ACC_PUBLIC |
@@ -752,7 +752,7 @@ trait CodeGeneration {
         ch << Ldc(0) << SWAP //srcArray, 0, targetArray
         ch << DUP << ARRAYLENGTH //targetArray, length on stack
         ch << Ldc(0) << SWAP //final arguments: src, 0, target, 0, length
-        ch << InvokeStatic("java/lang/System", "arraycopy", "(Ljava/lang/Object;ILjava/lang/Object;II)V")
+        ch << InvokeStatic("java/lang/System", "arraycopy", s"(L$ObjectClass;IL$ObjectClass;II)V")
 
         //targetArray remains on the stack
         ch << DUP
@@ -792,7 +792,7 @@ trait CodeGeneration {
 
 
         ch << Ldc(prob.as.size)
-        ch << NewArray("java/lang/Object")
+        ch << NewArray(ObjectClass)
 
         for ((id, i) <- prob.as.zipWithIndex) {
           ch << DUP
@@ -802,14 +802,14 @@ trait CodeGeneration {
           ch << AASTORE
         }
 
-        ch << InvokeStatic(ChooseEntryPointClass, "invoke", "(I[Ljava/lang/Object;)Ljava/lang/Object;")
+        ch << InvokeStatic(ChooseEntryPointClass, "invoke", s"(I[L$ObjectClass;)L$ObjectClass;")
 
         mkUnbox(choose.getType, ch)
 
       case gv @ GenericValue(tp, int) =>
         val id = runtime.GenericValues.register(gv)
         ch << Ldc(id)
-        ch << InvokeStatic(GenericValuesClass, "get", "(I)Ljava/lang/Object;")
+        ch << InvokeStatic(GenericValuesClass, "get", s"(I)L$ObjectClass;")
       
       case nt @ NoTree( tp@(Int32Type | BooleanType | UnitType | CharType)) =>
         mkExpr(simplestValue(tp), ch)
@@ -966,7 +966,7 @@ trait CodeGeneration {
             ch << If_ICmpEq(thenn) << Goto(elze)
 
           case _ =>
-            ch << InvokeVirtual("java/lang/Object", "equals", "(Ljava/lang/Object;)Z")
+            ch << InvokeVirtual(s"$ObjectClass", "equals", s"(L$ObjectClass;)Z")
             ch << IfEq(elze) << Goto(thenn)
         }
 
@@ -1271,7 +1271,7 @@ trait CodeGeneration {
 
         case None =>
           // Call constructor of java.lang.Object
-          cch << InvokeSpecial("java/lang/Object", constructorName, "()V")
+          cch << InvokeSpecial(ObjectClass, constructorName, "()V")
       }
       
       // Initialize special monitor field
@@ -1419,7 +1419,7 @@ trait CodeGeneration {
         } else {
           // Call constructor of java.lang.Object
           cch << ALoad(0)
-          cch << InvokeSpecial("java/lang/Object", constructorName, "()V")
+          cch << InvokeSpecial(ObjectClass, constructorName, "()V")
         }
 
         
@@ -1460,7 +1460,7 @@ trait CodeGeneration {
     }
 
     locally {
-      val pem = cf.addMethod("[Ljava/lang/Object;", "productElements")
+      val pem = cf.addMethod(s"[L$ObjectClass;", "productElements")
       pem.setFlags((
         METHOD_ACC_PUBLIC |
         METHOD_ACC_FINAL
@@ -1469,7 +1469,7 @@ trait CodeGeneration {
       val pech = pem.codeHandler
 
       pech << Ldc(ccd.fields.size)
-      pech << NewArray("java/lang/Object")
+      pech << NewArray(ObjectClass)
 
       for ((f, i) <- ccd.fields.zipWithIndex) {
         pech << DUP
@@ -1490,7 +1490,7 @@ trait CodeGeneration {
 
     // definition of equals
     locally {
-      val emh = cf.addMethod("Z", "equals", "Ljava/lang/Object;")
+      val emh = cf.addMethod("Z", "equals", s"L$ObjectClass;")
       emh.setFlags((
         METHOD_ACC_PUBLIC |
         METHOD_ACC_FINAL
@@ -1527,7 +1527,7 @@ trait CodeGeneration {
               ech << If_ICmpNe(notEq)
 
             case ot =>
-              ech << InvokeVirtual("java/lang/Object", "equals", "(Ljava/lang/Object;)Z") << IfEq(notEq)
+              ech << InvokeVirtual(ObjectClass, "equals", s"(L$ObjectClass;)Z") << IfEq(notEq)
           }
         }
       } 
@@ -1554,10 +1554,10 @@ trait CodeGeneration {
       hch << IfEq(wasNotCached)
       hch << IRETURN
       hch << Label(wasNotCached) << POP
-      hch << ALoad(0) << InvokeVirtual(cName, "productElements", "()[Ljava/lang/Object;")
+      hch << ALoad(0) << InvokeVirtual(cName, "productElements", s"()[L$ObjectClass;")
       hch << ALoad(0) << InvokeVirtual(cName, "productName", "()Ljava/lang/String;")
       hch << InvokeVirtual("java/lang/String", "hashCode", "()I")
-      hch << InvokeStatic(HashingClass, "seqHash", "([Ljava/lang/Object;I)I") << DUP
+      hch << InvokeStatic(HashingClass, "seqHash", s"([L$ObjectClass;I)I") << DUP
       hch << ALoad(0) << SWAP << PutField(cName, hashFieldName, "I") 
       hch << IRETURN