diff --git a/src/main/scala/inox/ast/CallGraph.scala b/src/main/scala/inox/ast/CallGraph.scala
index ec749fcef3485f707f6e8801ae9ca9957e5cf741..eb0c3f0835543f4344a0a5f915611b00f32a3583 100644
--- a/src/main/scala/inox/ast/CallGraph.scala
+++ b/src/main/scala/inox/ast/CallGraph.scala
@@ -6,7 +6,7 @@ package ast
 import utils.Graphs._
 
 trait CallGraph {
-  private[ast] val trees: Trees
+  protected val trees: Trees
   import trees._
   import trees.exprOps._
   protected val symbols: Symbols
diff --git a/src/main/scala/inox/ast/Constructors.scala b/src/main/scala/inox/ast/Constructors.scala
index c365ba6285b64fd2389eb07ef3c2048f0d66a5b8..664408f30f0e4f8dfb6308026c1652fb5256fb93 100644
--- a/src/main/scala/inox/ast/Constructors.scala
+++ b/src/main/scala/inox/ast/Constructors.scala
@@ -10,7 +10,7 @@ package ast
   * @define encodingof Encoding of
   *  */
 trait Constructors {
-  private[ast] val trees: Trees
+  protected val trees: Trees
   import trees._
   import trees.exprOps._
   protected implicit val symbols: Symbols
diff --git a/src/main/scala/inox/ast/Definitions.scala b/src/main/scala/inox/ast/Definitions.scala
index a63f639e8d41ff207129864eb9294bdeb0d70e76..1ebe9ba2787af164d625652af09145b09bd0f68b 100644
--- a/src/main/scala/inox/ast/Definitions.scala
+++ b/src/main/scala/inox/ast/Definitions.scala
@@ -96,7 +96,7 @@ trait Definitions { self: Trees =>
     val classes: Map[Identifier, ClassDef]
     val functions: Map[Identifier, FunDef]
 
-    private[ast] val trees: self.type = self
+    protected val trees: self.type = self
     protected val symbols: this.type = this
 
     // @nv: this is a hack to reinject `this` into the set of implicits
diff --git a/src/main/scala/inox/ast/ExprOps.scala b/src/main/scala/inox/ast/ExprOps.scala
index c0583c6923468b38313e56fdc41a714bdd27d0ec..1a32fb14e163ae524d5e57dc68da9eb648d74880 100644
--- a/src/main/scala/inox/ast/ExprOps.scala
+++ b/src/main/scala/inox/ast/ExprOps.scala
@@ -48,7 +48,7 @@ trait ExprOps extends GenTreeOps {
     case _ => None
   } (expr)
 
-  object VariableExtractor {
+  protected class VariableExtractor {
     def unapply(e: Expr): Option[(Set[Variable], Set[Variable])] = e match {
       case v: Variable => Some((Set(v), Set.empty))
       case Let(vd, _, _) => Some((Set.empty, Set(vd.toVariable)))
@@ -59,6 +59,8 @@ trait ExprOps extends GenTreeOps {
     }
   }
 
+  protected val VariableExtractor = new VariableExtractor
+
   /** Returns the set of free variables in an expression */
   def variablesOf(expr: Expr): Set[Variable] = {
     fold[Set[Variable]] { case (e, subs) =>
diff --git a/src/main/scala/inox/ast/Trees.scala b/src/main/scala/inox/ast/Trees.scala
index 2d1aba675eb1e6d588dbfe0edfa21bb765dce3b2..cd1963046eb7aabd80265091543f68b2bc6ceebf 100644
--- a/src/main/scala/inox/ast/Trees.scala
+++ b/src/main/scala/inox/ast/Trees.scala
@@ -35,11 +35,11 @@ trait Trees
     override def toString = asString(PrinterOptions.fromContext(InoxContext.printNames))
   }
 
-  object exprOps extends {
+  val exprOps: ExprOps { val trees: Trees.this.type } = new {
     protected val trees: Trees.this.type = Trees.this
   } with ExprOps
 
-  object dsl extends {
+  val dsl: DSL { val trees: Trees.this.type } = new {
     protected val trees: Trees.this.type = Trees.this
   } with DSL
 
diff --git a/src/main/scala/inox/ast/TypeOps.scala b/src/main/scala/inox/ast/TypeOps.scala
index c6d1a97217975563594f04712c18f852f6e3550b..b24d8e1ae57bf20655f9253246425cae671d8dc7 100644
--- a/src/main/scala/inox/ast/TypeOps.scala
+++ b/src/main/scala/inox/ast/TypeOps.scala
@@ -4,7 +4,7 @@ package inox
 package ast
 
 trait TypeOps {
-  private[ast] val trees: Trees
+  protected val trees: Trees
   import trees._
   protected implicit val symbols: Symbols