diff --git a/src/main/scala/leon/codegen/CodeGeneration.scala b/src/main/scala/leon/codegen/CodeGeneration.scala
index f4bb00795246d15d3148bfbaa01dc4e9a1afab1a..1e37626f0cf378809dada9615b92c4ae9cf27336 100644
--- a/src/main/scala/leon/codegen/CodeGeneration.scala
+++ b/src/main/scala/leon/codegen/CodeGeneration.scala
@@ -279,7 +279,7 @@ trait CodeGeneration {
         }
         ch << InvokeSpecial(ccName, constructorName, ccApplySig)
 
-      case IsInstanceOf(cct, e) =>
+      case IsInstanceOf(e, cct) =>
         val (ccName, _) = leonClassToJVMInfo(cct.classDef).getOrElse {
           throw CompilationException("Unknown class : " + cct.id)
         }
diff --git a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
index 3f4a67f484dad28589684b4803d701316784860c..38710837fb255db8596334a1fe818b62835556fe 100644
--- a/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
+++ b/src/main/scala/leon/evaluators/RecursiveEvaluator.scala
@@ -231,7 +231,7 @@ abstract class RecursiveEvaluator(ctx: LeonContext, prog: Program, maxSteps: Int
         throw RuntimeError("Cast error: cannot cast "+le.asString+" to "+ct.asString) 
       }
 
-    case IsInstanceOf(ct, expr) =>
+    case IsInstanceOf(expr, ct) =>
       val le = e(expr)
       BooleanLiteral(isSubtypeOf(le.getType, ct))
 
diff --git a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
index 2c8325042cf20c119176961860f5b5297e20fe5b..0a6633aa4c107a81abbb020683059d55bb441b9f 100644
--- a/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
+++ b/src/main/scala/leon/frontends/scalac/CodeExtraction.scala
@@ -1427,7 +1427,7 @@ trait CodeExtraction extends ASTExtractors {
                 if(rootType != testedExprRootType) {
                   outOfSubsetError(tr, "isInstanceOf can only be used with compatible classes")
                 } else {
-                  IsInstanceOf(ct, ccRec)
+                  IsInstanceOf(ccRec, ct)
                 }
               }
             case _ =>
diff --git a/src/main/scala/leon/purescala/Constructors.scala b/src/main/scala/leon/purescala/Constructors.scala
index 5f217f2295262e81591039ca95c0fdcda2e495a9..22697b7dfd130b97eb671331afb7d1aebabdd686 100644
--- a/src/main/scala/leon/purescala/Constructors.scala
+++ b/src/main/scala/leon/purescala/Constructors.scala
@@ -383,8 +383,18 @@ object Constructors {
     if (isSubtypeOf(expr.getType, tpe)) {
       expr
     } else {
+      //println(s"$expr:${expr.getType} is not a subtype of $tpe")
       AsInstanceOf(expr, tpe)
     }
   }
 
+  def isInstOf(expr: Expr, tpe: ClassType) = {
+    if (isSubtypeOf(expr.getType, tpe)) {
+      BooleanLiteral(true)
+    } else {
+      IsInstanceOf(expr, tpe)
+    }
+
+  }
+
 }
diff --git a/src/main/scala/leon/purescala/ExprOps.scala b/src/main/scala/leon/purescala/ExprOps.scala
index 69267f7afe5c87c2007f67911e23381bdae2f424..91d36d7a9ea16b1d1b125ca075f039b8471d6ca2 100644
--- a/src/main/scala/leon/purescala/ExprOps.scala
+++ b/src/main/scala/leon/purescala/ExprOps.scala
@@ -771,7 +771,7 @@ object ExprOps {
           if (ct.parent.isEmpty) {
             bind(ob, in)
           } else {
-            and(IsInstanceOf(ct, in), bind(ob, in))
+            and(IsInstanceOf(in, ct), bind(ob, in))
           }
 
         case CaseClassPattern(ob, cct, subps) =>
@@ -779,7 +779,7 @@ object ExprOps {
           val pairs = cct.fields.map(_.id).toList zip subps.toList
           val subTests = pairs.map(p => rec(caseClassSelector(cct, in, p._1), p._2))
           val together = and(bind(ob, in) +: subTests :_*)
-          and(IsInstanceOf(cct, in), together)
+          and(IsInstanceOf(in, cct), together)
 
         case TuplePattern(ob, subps) =>
           val TupleType(tpes) = in.getType
@@ -1326,7 +1326,7 @@ object ExprOps {
         case ccd: CaseClassDef =>
           val cct = CaseClassType(ccd, tps)
 
-          val isType = IsInstanceOf(cct, Variable(on))
+          val isType = IsInstanceOf(Variable(on), cct)
 
           val recSelectors = cct.fields.collect { 
             case vd if vd.getType == on.getType => vd.id
diff --git a/src/main/scala/leon/purescala/Expressions.scala b/src/main/scala/leon/purescala/Expressions.scala
index 7882a6269774c32485c2584f63d1e728ebe81d65..b44a4b9f8e23e2a3a8de4e7b315562306bba1758 100644
--- a/src/main/scala/leon/purescala/Expressions.scala
+++ b/src/main/scala/leon/purescala/Expressions.scala
@@ -327,7 +327,7 @@ object Expressions {
         binder,
         FunctionInvocation(unapplyFun, Seq(scrut)),
         IfExpr(
-          IsInstanceOf(someType, Variable(binder)),
+          IsInstanceOf(Variable(binder), someType),
           someCase(CaseClassSelector(someType, Variable(binder), someValue.id)),
           noneCase
         )
@@ -424,7 +424,7 @@ object Expressions {
   }
 
   /** $encodingof `.isInstanceOf[...]` */
-  case class IsInstanceOf(classType: ClassType, expr: Expr) extends Expr {
+  case class IsInstanceOf(expr: Expr, classType: ClassType) extends Expr {
     val getType = BooleanType
   }
 
diff --git a/src/main/scala/leon/purescala/Extractors.scala b/src/main/scala/leon/purescala/Extractors.scala
index c8d54731ce53cb7ba6cd1dc8cdad769f0432181a..ca6a21fb028f785ec66ef8b03a4fdc1ec3cb7519 100644
--- a/src/main/scala/leon/purescala/Extractors.scala
+++ b/src/main/scala/leon/purescala/Extractors.scala
@@ -31,8 +31,8 @@ object Extractors {
         Some((Seq(t), (es: Seq[Expr]) => SetCardinality(es.head)))
       case CaseClassSelector(cd, e, sel) =>
         Some((Seq(e), (es: Seq[Expr]) => caseClassSelector(cd, es.head, sel)))
-      case IsInstanceOf(ct, e) =>
-        Some((Seq(e), (es: Seq[Expr]) => IsInstanceOf(ct, es.head)))
+      case IsInstanceOf(e, ct) =>
+        Some((Seq(e), (es: Seq[Expr]) => IsInstanceOf(es.head, ct)))
       case AsInstanceOf(e, ct) =>
         Some((Seq(e), (es: Seq[Expr]) => asInstOf(es.head, ct)))
       case TupleSelect(t, i) =>
diff --git a/src/main/scala/leon/purescala/MethodLifting.scala b/src/main/scala/leon/purescala/MethodLifting.scala
index 277803109cf845f467bec945784edfe54a4ed3fb..4848bf10effc93b0b8db481a26d2c53db297e5f0 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
         }
@@ -125,9 +125,9 @@ object MethodLifting extends TransformationPhase {
           newFd.fullBody,
           Some(and(
             prec,
-            IsInstanceOf(
-              c.typed(root.tparams.map{ _.tp }),
-              This(root.typed)
+            isInstOf(
+              This(root.typed),
+              c.typed(root.tparams.map{ _.tp })
             )
           ))
         ))
@@ -158,14 +158,18 @@ 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) =>
+              Some(asInstOf(receiver.toVariable, ct).setPos(th))
             case _ =>
               None
-          }(instantiateType(nfd.fullBody, tparamsMap, paramsMap))
+          }
+
+          val insTp: Expr => Expr = instantiateType(_, tparamsMap, paramsMap)
+
+          nfd.fullBody = insTp( postMap(thisToReceiver)(insTp(nfd.fullBody)) )
         } else {
           // We need to compose methods of subclasses
 
diff --git a/src/main/scala/leon/purescala/PrettyPrinter.scala b/src/main/scala/leon/purescala/PrettyPrinter.scala
index c9005ec2dd45d7f48d2a8bff7554a0e181b8fa07..6d020cc710bb5cf5dca8eda06dc4500163edf95a 100644
--- a/src/main/scala/leon/purescala/PrettyPrinter.scala
+++ b/src/main/scala/leon/purescala/PrettyPrinter.scala
@@ -167,7 +167,7 @@ class PrettyPrinter(opts: PrinterOptions,
       case Choose(pred)         => p"choose($pred)"
       case e @ Error(tpe, err)  => p"""error[$tpe]("$err")"""
       case AsInstanceOf(e, ct)  => p"""$e.asInstanceOf[$ct]"""
-      case IsInstanceOf(cct, e) =>
+      case IsInstanceOf(e, cct) =>
         if (cct.classDef.isCaseObject) {
           p"($e == $cct)"
         } else {
diff --git a/src/main/scala/leon/purescala/TypeOps.scala b/src/main/scala/leon/purescala/TypeOps.scala
index 0eac83d63f53889decae160e27a7840abc773abc..5c68340e678e1bf4858ed943dfffa9cb29f4b51c 100644
--- a/src/main/scala/leon/purescala/TypeOps.scala
+++ b/src/main/scala/leon/purescala/TypeOps.scala
@@ -273,14 +273,17 @@ object TypeOps {
           case mi @ MethodInvocation(r, cd, TypedFunDef(fd, tps), args) =>
             MethodInvocation(srec(r), cd, TypedFunDef(fd, tps.map(tpeSub)), args.map(srec)).copiedFrom(mi)
 
+          case th @ This(ct) =>
+            This(tpeSub(ct).asInstanceOf[ClassType]).copiedFrom(th)
+
           case cc @ CaseClass(ct, args) =>
             CaseClass(tpeSub(ct).asInstanceOf[CaseClassType], args.map(srec)).copiedFrom(cc)
 
           case cc @ CaseClassSelector(ct, e, sel) =>
             caseClassSelector(tpeSub(ct).asInstanceOf[CaseClassType], srec(e), sel).copiedFrom(cc)
 
-          case cc @ IsInstanceOf(ct, e) =>
-            IsInstanceOf(tpeSub(ct).asInstanceOf[ClassType], srec(e)).copiedFrom(cc)
+          case cc @ IsInstanceOf(e, ct) =>
+            IsInstanceOf(srec(e), tpeSub(ct).asInstanceOf[ClassType]).copiedFrom(cc)
 
           case cc @ AsInstanceOf(e, ct) =>
             AsInstanceOf(srec(e), tpeSub(ct).asInstanceOf[ClassType]).copiedFrom(cc)
diff --git a/src/main/scala/leon/solvers/smtlib/SMTLIBSolver.scala b/src/main/scala/leon/solvers/smtlib/SMTLIBSolver.scala
index aaf65f508e0d700ea08036734ba95d131e763781..bcf8a5fa197de9f95e6ec40b337ce0779bed56a6 100644
--- a/src/main/scala/leon/solvers/smtlib/SMTLIBSolver.scala
+++ b/src/main/scala/leon/solvers/smtlib/SMTLIBSolver.scala
@@ -333,7 +333,7 @@ abstract class SMTLIBSolver(val context: LeonContext,
       case AsInstanceOf(expr, cct) =>
         toSMT(expr)
 
-      case IsInstanceOf(cct, e) =>
+      case IsInstanceOf(e, cct) =>
         declareSort(cct)
         val cases = cct match {
           case act: AbstractClassType =>
diff --git a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
index 07943a8b971900220ec2b2771ee320dae5896dea..bfa1d9c165a80948ac132cf15419059c7f2ca266 100644
--- a/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
+++ b/src/main/scala/leon/solvers/z3/AbstractZ3Solver.scala
@@ -426,16 +426,16 @@ trait AbstractZ3Solver extends Solver {
       case AsInstanceOf(expr, ct) =>
         rec(expr)
 
-      case IsInstanceOf(act: AbstractClassType, e) =>
+      case IsInstanceOf(e, act: AbstractClassType) =>
         act.knownCCDescendants match {
           case Seq(cct) =>
-            rec(IsInstanceOf(cct, e))
+            rec(IsInstanceOf(e, cct))
           case more =>
             val i = FreshIdentifier("e", act, alwaysShowUniqueID = true)
-            rec(Let(i, e, orJoin(more map(IsInstanceOf(_, Variable(i))))))
+            rec(Let(i, e, orJoin(more map(IsInstanceOf(Variable(i), _)))))
         }
 
-      case IsInstanceOf(cct: CaseClassType, e) =>
+      case IsInstanceOf(e, cct: CaseClassType) =>
         typeToSort(cct) // Making sure the sort is defined
         val tester = testers.toB(cct)
         tester(rec(e))
diff --git a/src/main/scala/leon/synthesis/rules/ADTDual.scala b/src/main/scala/leon/synthesis/rules/ADTDual.scala
index f8770aafd001124c47b42ebc1114eb66e732423f..392670edff7420493b7d17d87ff94358f962c172 100644
--- a/src/main/scala/leon/synthesis/rules/ADTDual.scala
+++ b/src/main/scala/leon/synthesis/rules/ADTDual.scala
@@ -18,10 +18,10 @@ case object ADTDual extends NormalizingRule("ADTDual") {
 
     val (toRemove, toAdd) = exprs.collect {
       case eq @ Equals(cc @ CaseClass(ct, args), e) if (variablesOf(e) -- as).isEmpty && (variablesOf(cc) & xs).nonEmpty =>
-        (eq, IsInstanceOf(ct, e) +: (ct.fields zip args).map{ case (vd, ex) => Equals(ex, caseClassSelector(ct, e, vd.id)) } )
+        (eq, IsInstanceOf(e, ct) +: (ct.fields zip args).map{ case (vd, ex) => Equals(ex, caseClassSelector(ct, e, vd.id)) } )
 
       case eq @ Equals(e, cc @ CaseClass(ct, args)) if (variablesOf(e) -- as).isEmpty && (variablesOf(cc) & xs).nonEmpty =>
-        (eq, IsInstanceOf(ct, e) +: (ct.fields zip args).map{ case (vd, ex) => Equals(ex, caseClassSelector(ct, e, vd.id)) } )
+        (eq, IsInstanceOf(e, ct) +: (ct.fields zip args).map{ case (vd, ex) => Equals(ex, caseClassSelector(ct, e, vd.id)) } )
     }.unzip
 
     if (toRemove.nonEmpty) {
diff --git a/src/main/scala/leon/synthesis/rules/ADTInduction.scala b/src/main/scala/leon/synthesis/rules/ADTInduction.scala
index 3b6df4524b7657851f84423aae27117a75023e63..9f379108f9c20cd5022161e83d1332d8fc9e632b 100644
--- a/src/main/scala/leon/synthesis/rules/ADTInduction.scala
+++ b/src/main/scala/leon/synthesis/rules/ADTInduction.scala
@@ -68,7 +68,7 @@ case object ADTInduction extends Rule("ADT Induction") {
           val subPC  = substAll(Map(inductOn -> CaseClass(cct, newIds.map(Variable))), innerPC)
           val subWS  = substAll(Map(inductOn -> CaseClass(cct, newIds.map(Variable))), innerWS)
 
-          val subPre = IsInstanceOf(cct, Variable(origId))
+          val subPre = IsInstanceOf(Variable(origId), cct)
 
           val subProblem = Problem(inputs ::: residualArgs, subWS, andJoin(subPC :: postFs), subPhi, p.xs)
 
diff --git a/src/main/scala/leon/synthesis/rules/ADTLongInduction.scala b/src/main/scala/leon/synthesis/rules/ADTLongInduction.scala
index 09389719601af48d487c7f52ba32424d22a497c9..4a5adceed04dcaca8e3279d76d0220b54797676a 100644
--- a/src/main/scala/leon/synthesis/rules/ADTLongInduction.scala
+++ b/src/main/scala/leon/synthesis/rules/ADTLongInduction.scala
@@ -82,7 +82,7 @@ case object ADTLongInduction extends Rule("ADT Long Induction") {
 
                 val newMap = trMap.mapValues(v => substAll(Map(id -> CaseClass(cct, subIds.map(Variable))), v))
 
-                InductCase(newIds, newCalls, newPattern, and(pc, IsInstanceOf(cct, Variable(id))), newMap)
+                InductCase(newIds, newCalls, newPattern, and(pc, IsInstanceOf(Variable(id), cct)), newMap)
               }
             }).flatten
           } else {
diff --git a/src/main/scala/leon/synthesis/rules/ADTSplit.scala b/src/main/scala/leon/synthesis/rules/ADTSplit.scala
index 6485d3ffa92f3b52cd00ba6b21fbc66cfff98dd1..294c6e1374fa09ed6e54690aecfb4661b5073d04 100644
--- a/src/main/scala/leon/synthesis/rules/ADTSplit.scala
+++ b/src/main/scala/leon/synthesis/rules/ADTSplit.scala
@@ -23,7 +23,7 @@ case object ADTSplit extends Rule("ADT Split.") {
         val optCases = for (dcd <- cd.knownDescendants.sortBy(_.id.name)) yield dcd match {
           case ccd : CaseClassDef =>
             val cct = CaseClassType(ccd, tpes)
-            val toSat = and(p.pc, IsInstanceOf(cct, Variable(id)))
+            val toSat = and(p.pc, IsInstanceOf(Variable(id), cct))
 
             val isImplied = solver.solveSAT(toSat) match {
               case (Some(false), _) => true
@@ -86,7 +86,7 @@ case object ADTSplit extends Rule("ADT Split.") {
                 val substs = (for ((field,arg) <- cct.fields zip problem.as ) yield {
                   (arg, caseClassSelector(cct, id.toVariable, field.id))
                 }).toMap
-                globalPre ::= and(IsInstanceOf(cct, Variable(id)), replaceFromIDs(substs, sol.pre))
+                globalPre ::= and(IsInstanceOf(Variable(id), cct), replaceFromIDs(substs, sol.pre))
               } else {
                 globalPre ::= BooleanLiteral(true)
               }
diff --git a/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala b/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala
index c4acb572176b2ccc9868013c2aefc4f11cf11703..227dd691c29734e0dd85feb179f40fac15ceea7a 100644
--- a/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala
+++ b/src/main/scala/leon/synthesis/rules/EquivalentInputs.scala
@@ -22,7 +22,7 @@ case object EquivalentInputs extends NormalizingRule("EquivalentInputs") {
 
       val clauses = allClauses.filterNot(instanceOfs.toSet)
 
-      val ccSubsts = for (IsInstanceOf(cct: CaseClassType, s) <- instanceOfs) yield {
+      val ccSubsts = for (IsInstanceOf(s, cct: CaseClassType) <- instanceOfs) yield {
 
         val fieldsVals = (for (f <- cct.fields) yield {
           val id = f.id
diff --git a/src/main/scala/leon/termination/SelfCallsProcessor.scala b/src/main/scala/leon/termination/SelfCallsProcessor.scala
index b8fe65f48b3776d8a8f3dae6782133c6518ec00d..157dbce24bf26aef4e44ae7bb9928dca348be98b 100644
--- a/src/main/scala/leon/termination/SelfCallsProcessor.scala
+++ b/src/main/scala/leon/termination/SelfCallsProcessor.scala
@@ -52,7 +52,7 @@ class SelfCallsProcessor(val checker: TerminationChecker) extends Processor {
       case Not(expr: Expr) => rec(expr)
       case Equals(lhs: Expr, rhs: Expr) => rec(lhs) || rec(rhs)
       case CaseClass(ct, args: Seq[Expr]) => args.exists(arg => rec(arg)) 
-      case IsInstanceOf(ct, expr: Expr) => rec(expr)
+      case IsInstanceOf(expr: Expr, ct) => rec(expr)
       case AsInstanceOf(expr: Expr, ct) => rec(expr)
       case CaseClassSelector(ct, caseClassExpr, selector) => rec(caseClassExpr)
       case Plus(lhs: Expr, rhs: Expr) => rec(lhs) || rec(rhs)
diff --git a/src/main/scala/leon/utils/TypingPhase.scala b/src/main/scala/leon/utils/TypingPhase.scala
index 05648fc9fc14608b7321ffd4f341cb5467a88d01..cb0f37ab514faa26275e655f9e6aacad0d1cb171 100644
--- a/src/main/scala/leon/utils/TypingPhase.scala
+++ b/src/main/scala/leon/utils/TypingPhase.scala
@@ -35,7 +35,7 @@ object TypingPhase extends LeonPhase[Program, Program] {
       fd.precondition = {
         val argTypesPreconditions = fd.params.flatMap(arg => arg.getType match {
           case cct: ClassType if cct.parent.isDefined =>
-            Seq(IsInstanceOf(cct, arg.id.toVariable))
+            Seq(IsInstanceOf(arg.id.toVariable, cct))
           case at: ArrayType =>
             Seq(GreaterEquals(ArrayLength(arg.id.toVariable), IntLiteral(0)))
           case _ =>
@@ -57,7 +57,7 @@ object TypingPhase extends LeonPhase[Program, Program] {
             case Some(p) =>
               Some(Lambda(Seq(ValDef(resId)), and(
                 application(p, Seq(Variable(resId))),
-                IsInstanceOf(ct, Variable(resId))
+                IsInstanceOf(Variable(resId), ct)
               ).setPos(p)).setPos(p))
 
             case None =>
@@ -65,7 +65,7 @@ object TypingPhase extends LeonPhase[Program, Program] {
                 case Some(df: DefinedPosition) => df.focusEnd
                 case _ => NoPosition
               }
-              Some(Lambda(Seq(ValDef(resId)), IsInstanceOf(ct, Variable(resId))).setPos(pos))
+              Some(Lambda(Seq(ValDef(resId)), IsInstanceOf(Variable(resId), ct)).setPos(pos))
           }
         }
         case _ => fd.postcondition
diff --git a/src/main/scala/leon/verification/InductionTactic.scala b/src/main/scala/leon/verification/InductionTactic.scala
index 9e06e4abd0fb88c8c0db782f27880390e814d34f..74b7b99af5de75d16eed02b93ecf081ddb9e93f6 100644
--- a/src/main/scala/leon/verification/InductionTactic.scala
+++ b/src/main/scala/leon/verification/InductionTactic.scala
@@ -40,7 +40,7 @@ class InductionTactic(vctx: VerificationContext) extends DefaultTactic(vctx) {
           }
 
           val vc = implies(
-            and(IsInstanceOf(cct, arg.toVariable), precOrTrue(fd)),
+            and(IsInstanceOf(arg.toVariable, cct), precOrTrue(fd)),
             implies(andJoin(subCases), application(post, Seq(body)))
           )
 
@@ -77,7 +77,7 @@ class InductionTactic(vctx: VerificationContext) extends DefaultTactic(vctx) {
           }
 
           val vc = implies(
-            andJoin(Seq(IsInstanceOf(cct, arg.toVariable), precOrTrue(fd), path) ++ subCases),
+            andJoin(Seq(IsInstanceOf(arg.toVariable, cct), precOrTrue(fd), path) ++ subCases),
             tfd.withParamSubst(args, pre)
           )
 
diff --git a/src/main/scala/leon/verification/InjectAsserts.scala b/src/main/scala/leon/verification/InjectAsserts.scala
index 871662815ff0efb3d5484c89e8b5569fa5c2a350..8244da31a6d9b8b97e559e7e2ca0b172ce4f7dcf 100644
--- a/src/main/scala/leon/verification/InjectAsserts.scala
+++ b/src/main/scala/leon/verification/InjectAsserts.scala
@@ -36,7 +36,7 @@ object InjectAsserts extends LeonPhase[Program, Program] {
           Some(Assert(MapIsDefinedAt(m, k), Some("Map undefined at this index"), e).setPos(e))
 
         case e @ AsInstanceOf(expr, ct)  =>
-          Some(Assert(IsInstanceOf(ct, expr),
+          Some(Assert(IsInstanceOf(expr, ct),
                       Some("Cast error"),
                       e
                      ).setPos(e))
diff --git a/src/test/scala/leon/unit/purescala/TypeOpsSuite.scala b/src/test/scala/leon/unit/purescala/TypeOpsSuite.scala
index 5d88675507933df093e57dd72b714eeda64b3bb9..57f37ed34792070df06a704f1d1d2e074691959f 100644
--- a/src/test/scala/leon/unit/purescala/TypeOpsSuite.scala
+++ b/src/test/scala/leon/unit/purescala/TypeOpsSuite.scala
@@ -18,7 +18,6 @@ class TypeOpsSuite extends LeonTestSuite with helpers.WithLikelyEq with helpers.
 
     val tp2   = TypeParameter.fresh("A")
     val tp3   = TypeParameter.fresh("B")
-    val tp4   = TypeParameter.fresh("C")
 
     val listD = AbstractClassDef(FreshIdentifier("List"), Seq(tpD), None)
     val listT = listD.typed
@@ -58,6 +57,8 @@ class TypeOpsSuite extends LeonTestSuite with helpers.WithLikelyEq with helpers.
     assert(canBeSubtypeOf(tp,           Seq(tp2), tp2, rhsFixed = true).isEmpty,    "T </: A with A free but lhs is fixed")
 
     assert(canBeSubtypeOf(listT,        Seq(tp),  listD.typed(Seq(tp2)), rhsFixed = true).isDefined,    "List[T] <: List[A] with T free and rhs fixed")
+
+    assert(isSubtypeOf(listD.typed, listD.typed), "List[T] <: List[T]")
   }
 
 }