diff --git a/CHANGES.md b/CHANGES.md
index 64137c56d95804aff50a82477c1c5b99b2e78a43..b054dda822a4658eef9e4db182518cff57837104 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,5 +1,11 @@
 # Change List
 
+## 2023-12-06
+Upgrade to Scala 3.3.1
+
+- the `Proof` class has been temporarily unsealed, till [lampepfl/dotty#19031](https://github.com/lampepfl/dotty/issues/19031) / [epfl-lara/lisa#190](https://github.com/epfl-lara/lisa/issues/190) is fixed
+- minor fixes to address compilation errors, mostly involving explicitly specifying types or implicits in some places.
+
 ## 2023-12-02
 Creation of the present Change Liste, going back to October 2023
 
diff --git a/build.sbt b/build.sbt
index 2363514675c88cbb9850b3f17f952f1e1f47be0b..8178b55994a3812d5655501a33bf6e6d8884a385 100644
--- a/build.sbt
+++ b/build.sbt
@@ -26,7 +26,7 @@ val commonSettings = Seq(
 
 
 val scala2 = "2.13.8"
-val scala3 = "3.2.2"
+val scala3 = "3.3.1"
 
 val commonSettings2 = commonSettings ++ Seq(
   scalaVersion := scala2,
@@ -94,7 +94,15 @@ lazy val utils = Project(
   .dependsOn(scallion % "compile->compile")
   .settings(libraryDependencies += "io.github.leoprover" % "scala-tptp-parser_2.13" % "1.4")
 
-
+ThisBuild / assemblyMergeStrategy := {
+  case PathList("module-info.class") => MergeStrategy.discard
+  case x if x.endsWith("/module-info.class") => MergeStrategy.discard
+  case x if x.endsWith(".class") => MergeStrategy.first
+  case x if x.endsWith(".tasty") => MergeStrategy.first
+  case x =>
+    val oldStrategy = (ThisBuild / assemblyMergeStrategy).value
+    oldStrategy(x)
+}
 
 
 lazy val examples = Project(
diff --git a/lisa-sets/src/main/scala/lisa/automation/CommonTactics.scala b/lisa-sets/src/main/scala/lisa/automation/CommonTactics.scala
index 6de053d76693ba36dbbe031267d3faf66214aab4..3ecd56b43bcc91e6770259727b0374c401212356 100644
--- a/lisa-sets/src/main/scala/lisa/automation/CommonTactics.scala
+++ b/lisa-sets/src/main/scala/lisa/automation/CommonTactics.scala
@@ -143,18 +143,19 @@ object CommonTactics {
         case Some(value: lib.FunctionDefinition[?]) => value
         case _ => return proof.InvalidProofTactic("Could not get definition of function.")
       }
-      val method = expr.f.substituteUnsafe(expr.vars.zip(xs).toMap) match {
-        case F.AppliedConnector(
-              F.And,
-              Seq(
-                F.AppliedConnector(F.Implies, Seq(a, _)),
-                F.AppliedConnector(F.Implies, Seq(b, _))
-              )
-            ) if F.isSame(F.Neg(a), b) =>
-          conditional
-
-        case _ => unconditional
-      }
+      val method: (F.ConstantFunctionLabel[?], proof.Fact) => Seq[F.Term] => F.Sequent => proof.ProofTacticJudgement = 
+        expr.f.substituteUnsafe(expr.vars.zip(xs).toMap) match {
+          case F.AppliedConnector(
+                F.And,
+                Seq(
+                  F.AppliedConnector(F.Implies, Seq(a, _)),
+                  F.AppliedConnector(F.Implies, Seq(b, _))
+                )
+              ) if F.isSame(F.Neg(a), b) =>
+            conditional(using lib, proof)
+
+          case _ => unconditional(using lib, proof)
+        }
       method(f, uniqueness)(xs)(bot)
     }
 
diff --git a/lisa-sets/src/main/scala/lisa/maths/settheory/orderings/Induction.scala b/lisa-sets/src/main/scala/lisa/maths/settheory/orderings/Induction.scala
index e57c06834cc5d2d7aab8467e51ff8f13e4f57a87..b43484c7969cfe21c519a45c47b45a5f1cdd82d4 100644
--- a/lisa-sets/src/main/scala/lisa/maths/settheory/orderings/Induction.scala
+++ b/lisa-sets/src/main/scala/lisa/maths/settheory/orderings/Induction.scala
@@ -4,7 +4,7 @@ import lisa.automation.settheory.SetTheoryTactics.*
 import lisa.maths.Quantifiers.*
 import lisa.maths.settheory.SetTheory.*
 import lisa.maths.settheory.orderings.InclusionOrders.*
-import lisa.maths.settheory.orderings.Ordinals.*
+import Ordinals.*
 import lisa.maths.settheory.orderings.PartialOrders.*
 import lisa.maths.settheory.orderings.Segments.*
 import lisa.maths.settheory.orderings.WellOrders.*
diff --git a/lisa-sets/src/main/scala/lisa/maths/settheory/orderings/Recursion.scala b/lisa-sets/src/main/scala/lisa/maths/settheory/orderings/Recursion.scala
index 6182209bd8378c5dddb3f79c72b4b7d856b96553..60af52ffe3783d2117b63b7fd952a9532695dd35 100644
--- a/lisa-sets/src/main/scala/lisa/maths/settheory/orderings/Recursion.scala
+++ b/lisa-sets/src/main/scala/lisa/maths/settheory/orderings/Recursion.scala
@@ -5,7 +5,7 @@ import lisa.maths.Quantifiers.*
 import lisa.maths.settheory.SetTheory.*
 import lisa.maths.settheory.orderings.InclusionOrders.*
 import lisa.maths.settheory.orderings.Induction.*
-import lisa.maths.settheory.orderings.Ordinals.*
+import Ordinals.*
 import lisa.maths.settheory.orderings.PartialOrders.*
 import lisa.maths.settheory.orderings.Segments.*
 import lisa.maths.settheory.orderings.WellOrders.*
diff --git a/lisa-sets/src/main/scala/lisa/maths/settheory/orderings/Segments.scala b/lisa-sets/src/main/scala/lisa/maths/settheory/orderings/Segments.scala
index 0ecd5aae7f41f37d936900c0e1019ad25991dc71..877ad4593786f811633025be56617b9de299d3bc 100644
--- a/lisa-sets/src/main/scala/lisa/maths/settheory/orderings/Segments.scala
+++ b/lisa-sets/src/main/scala/lisa/maths/settheory/orderings/Segments.scala
@@ -4,7 +4,7 @@ import lisa.automation.settheory.SetTheoryTactics.*
 import lisa.maths.Quantifiers.*
 import lisa.maths.settheory.SetTheory.*
 import lisa.maths.settheory.orderings.InclusionOrders.*
-import lisa.maths.settheory.orderings.Ordinals.*
+import Ordinals.*
 import lisa.maths.settheory.orderings.PartialOrders.*
 import lisa.maths.settheory.orderings.WellOrders.*
 
diff --git a/lisa-utils/src/main/scala/lisa/prooflib/WithTheorems.scala b/lisa-utils/src/main/scala/lisa/prooflib/WithTheorems.scala
index 24614ca346eaae469dfffeba1a11fb1a57d67c31..46a510d48d084fda7d4fd8e4c05823cc90885bbd 100644
--- a/lisa-utils/src/main/scala/lisa/prooflib/WithTheorems.scala
+++ b/lisa-utils/src/main/scala/lisa/prooflib/WithTheorems.scala
@@ -25,7 +25,10 @@ trait WithTheorems {
    *
    * @param assump list of starting assumptions, usually propagated from outer proofs.
    */
-  sealed abstract class Proof(assump: List[F.Formula]) {
+  // TODO: reseal this class
+  // see https://github.com/lampepfl/dotty/issues/19031
+  // and https://github.com/epfl-lara/lisa/issues/190
+  abstract class Proof(assump: List[F.Formula]) {
     val possibleGoal: Option[F.Sequent]
     type SelfType = this.type
     type OutsideFact >: JUSTIFICATION
@@ -259,11 +262,11 @@ trait WithTheorems {
      */
     def asOutsideFact(j: JUSTIFICATION): OutsideFact
 
-    @nowarn("msg=.*It would fail on pattern case: _: InnerProof.*")
-    def depth: Int = this match {
-      case p: Proof#InnerProof => 1 + p.parent.depth
-      case _: BaseProof => 0
-    }
+    def depth: Int =
+      (this: @unchecked) match {
+        case p: Proof#InnerProof => 1 + p.parent.depth
+        case _: BaseProof => 0
+      }
 
     /**
      * Create a subproof inside the current proof. The subproof will have the same assumptions as the current proof.