diff --git a/src/main/scala/leon/purescala/MethodLifting.scala b/src/main/scala/leon/purescala/MethodLifting.scala
index 277803109cf845f467bec945784edfe54a4ed3fb..6dded733c5383c885177e49abcafb33143328889 100644
--- a/src/main/scala/leon/purescala/MethodLifting.scala
+++ b/src/main/scala/leon/purescala/MethodLifting.scala
@@ -79,8 +79,8 @@ object MethodLifting extends TransformationPhase {
         val at = acd.typed
         val binder = FreshIdentifier(acd.id.name.toLowerCase, at, true)
         def subst(e: Expr): Expr = e match {
-          case This(`at`) =>
-            Variable(binder)
+          case This(ct) =>
+            asInstOf(Variable(binder), ct)
           case e =>
             e
         }
@@ -158,14 +158,19 @@ object MethodLifting extends TransformationPhase {
         nfd.addFlag(IsMethod(cd))
 
         if (cd.knownDescendants.forall( cd => (cd.methods ++ cd.fields).forall(_.id != fd.id))) {
-          val paramsMap = fd.params.zip(fdParams).map{case (x,y) => (x.id, y.id)}.toMap
           // Don't need to compose methods
-          nfd.fullBody = postMap {
-            case th@This(ct) if ct.classDef == cd =>
-              Some(receiver.toVariable.setPos(th))
+          val paramsMap = fd.params.zip(fdParams).map{case (x,y) => (x.id, y.id)}.toMap
+          def thisToReceiver(e: Expr): Option[Expr] = e match {
+            case th@This(ct) => //if ct.classDef == cd =>
+              Some(asInstOf(receiver.toVariable, ct).setPos(th))
             case _ =>
               None
-          }(instantiateType(nfd.fullBody, tparamsMap, paramsMap))
+          }
+          nfd.fullBody = instantiateType(
+            postMap(thisToReceiver)(nfd.fullBody),
+            tparamsMap,
+            paramsMap
+          )
         } else {
           // We need to compose methods of subclasses