diff --git a/src/funcheck/AnalysisComponent.scala b/src/funcheck/AnalysisComponent.scala
index 15307402474e04f42c6f2066f8f241ad07bd7cef..fbe462a710a7fc46c4b4eea0a5ce87bbcf2ea950 100644
--- a/src/funcheck/AnalysisComponent.scala
+++ b/src/funcheck/AnalysisComponent.scala
@@ -66,6 +66,7 @@ class AnalysisComponent(val global: Global, val pluginInstance: FunCheckPlugin)
       tree match {
         case c @ ClassDef(mods, name, tparams, impl) => {
           val s = c.symbol
+          
           println(s)
 
           if(s.isTrait)
diff --git a/src/funcheck/purescala/Trees.scala b/src/funcheck/purescala/Trees.scala
index 3b134bac09f830c51a0f6b69bf86ba021b9b25c2..4f26db4218d86ce57e3f13c3b92987170ed09fe7 100644
--- a/src/funcheck/purescala/Trees.scala
+++ b/src/funcheck/purescala/Trees.scala
@@ -66,15 +66,14 @@ see examples in:
   }
 
   case class SimpleCase(pattern: Pattern, rhs: Expr) extends MatchCase
-  case class GuardedCase(pattern: Pattern, guard: Expr, rhs: Expr) extends MatchCase
+  case class GuardedCase(pattern: Pattern, guard: Expr, rhs: Expr) extends MatchCase {
+    assert(guard.getType == BooleanType)
+  }
 
   sealed abstract class Pattern
-  // c: Class
-  case class InstanceOfPattern(binder: Option[Identifier], klass: ClassDef) extends Pattern
-  // c @ Constructor(...)
-  case class ConstructorPattern(binder: Option[Identifier]) extends Pattern
-  // c @ _
-  case class WildcardPattern(binder: Option[Identifier]) extends Pattern
+  case class InstanceOfPattern(binder: Option[Identifier], classTypeDef: ClassTypeDef) extends Pattern // c: Class
+  case class WildcardPattern(binder: Option[Identifier]) extends Pattern // c @ _
+  case class ExtractorPattern(binder: Option[Identifier], subPatterns: Seq[Pattern]) extends Pattern // c @ Extractor(...,...)
   // I suggest we skip Seq stars for now.
 
   /* Propositional logic */
@@ -240,8 +239,14 @@ see examples in:
   type VarDecls = Seq[VarDecl]
 
   sealed abstract class Definition(name : Identifier)
-  case class CaseClassDef(name : Identifier, fields : VarDecls) extends Definition(name)
-  case class ClassDef(name : Identifier, fields : VarDecls) extends Definition(name)
+
+  /** Useful because case classes and classes are somewhat unified in some
+   * patterns (of pattern-matching, that is) */
+  trait ClassTypeDef
+
+  case class CaseClassDef(name : Identifier, fields : VarDecls) extends Definition(name) with ClassTypeDef
+  case class ClassDef(name : Identifier, fields : VarDecls) extends Definition(name) with ClassTypeDef
+  
   case class ValDef(name : Identifier, value : Expr) extends Definition(name)
   case class FunDef(name : Identifier, args : VarDecls, body : Expr) extends Definition(name) {
     lazy val argTypes : Seq[TypeTree] = args.map(_._2)