diff --git a/src/main/scala/leon/purescala/TypeTrees.scala b/src/main/scala/leon/purescala/TypeTrees.scala
index feb400baf7f4a71a5fc51ab050b17b5ce5662c39..91d597535a1e12348f1a3634905da38851b4b8d9 100644
--- a/src/main/scala/leon/purescala/TypeTrees.scala
+++ b/src/main/scala/leon/purescala/TypeTrees.scala
@@ -166,8 +166,32 @@ object TypeTrees {
   case object Int32Type extends TypeTree
   case object UnitType extends TypeTree
 
+  class TupleType private (val bases: Seq[TypeTree]) extends TypeTree {
+    lazy val dimension: Int = bases.length
+
+    override def equals(other: Any): Boolean = {
+      other match {
+        case (t: TupleType) => t.bases == bases
+        case _ => false
+      }
+    }
+
+    override def hashCode: Int = {
+      bases.foldLeft(42)((acc, t) => acc + t.hashCode)
+    }
+
+  }
+  object TupleType {
+    def apply(bases: Seq[TypeTree]): TupleType = {
+      new TupleType(bases.map(bestRealType(_)))
+    }
+    def unapply(expr: TupleType): Option[Seq[TypeTree]] = expr match {
+      case (t: TupleType) => Some(t.bases)
+      case _ => None
+    }
+  }
+
   case class ListType(base: TypeTree) extends TypeTree
-  case class TupleType(bases: Seq[TypeTree]) extends TypeTree { lazy val dimension: Int = bases.length }
   case class SetType(base: TypeTree) extends TypeTree
   case class MultisetType(base: TypeTree) extends TypeTree
   case class MapType(from: TypeTree, to: TypeTree) extends TypeTree