diff --git a/compiler/src/dotty/tools/dotc/config/MigrationVersion.scala b/compiler/src/dotty/tools/dotc/config/MigrationVersion.scala
index 4a16111e76a5..2a4e252fa695 100644
--- a/compiler/src/dotty/tools/dotc/config/MigrationVersion.scala
+++ b/compiler/src/dotty/tools/dotc/config/MigrationVersion.scala
@@ -6,48 +6,36 @@ import SourceVersion.*
 import Feature.*
 import core.Contexts.Context
 
-class MigrationVersion(
-    val warnFrom: SourceVersion,
-    val errorFrom: SourceVersion):
-  require(warnFrom.ordinal <= errorFrom.ordinal)
-
-  def needsPatch(using Context): Boolean =
-    sourceVersion.isMigrating && sourceVersion.isAtLeast(warnFrom)
-
-  def patchFrom: SourceVersion =
-    warnFrom.prevMigrating
-
-object MigrationVersion:
-
-  val Scala2to3 = MigrationVersion(`3.0`, `3.0`)
-
-  val OverrideValParameter = MigrationVersion(`3.0`, future)
-
+enum MigrationVersion(val warnFrom: SourceVersion, val errorFrom: SourceVersion):
+  case Scala2to3 extends MigrationVersion(`3.0`, `3.0`)
+  case OverrideValParameter extends MigrationVersion(`3.0`, future)
   // we tighten for-comprehension without `case` to error in 3.4,
   // but we keep pat-defs as warnings for now ("@unchecked"),
   // until we propose an alternative way to assert exhaustivity to the typechecker.
-  val ForComprehensionPatternWithoutCase = MigrationVersion(`3.2`,  `3.4`)
-  val ForComprehensionUncheckedPathDefs = MigrationVersion(`3.2`,  future)
-
-  val NonLocalReturns = MigrationVersion(`3.2`, future)
-
-  val AscriptionAfterPattern = MigrationVersion(`3.3`, future)
-
-  val ExplicitContextBoundArgument = MigrationVersion(`3.4`, `3.5`)
+  case ForComprehensionPatternWithoutCase extends MigrationVersion(`3.2`,  `3.4`)
+  case ForComprehensionUncheckedPathDefs extends MigrationVersion(`3.2`,  future)
+
+  case NonLocalReturns extends MigrationVersion(`3.2`, future)
+  case AscriptionAfterPattern extends MigrationVersion(`3.3`, future)
+  case ExplicitContextBoundArgument extends MigrationVersion(`3.4`, `3.5`)
+  case AlphanumericInfix extends MigrationVersion(`3.4`, future)
+  case RemoveThisQualifier extends MigrationVersion(`3.4`, future)
+  case UninitializedVars extends MigrationVersion(`3.4`, future)
+  case VarargSpliceAscription extends MigrationVersion(`3.4`, future)
+  case WildcardType extends MigrationVersion(`3.4`, future)
+  case WithOperator extends MigrationVersion(`3.4`, future)
+  case FunctionUnderscore extends MigrationVersion(`3.4`, future)
+  case NonNamedArgumentInJavaAnnotation extends MigrationVersion(`3.6`, `3.6`)
+  case ImportWildcard extends MigrationVersion(future, future)
+  case ImportRename extends MigrationVersion(future, future)
+  case ParameterEnclosedByParenthesis extends MigrationVersion(future, future)
+  case XmlLiteral extends MigrationVersion(future, future)
 
-  val AlphanumericInfix = MigrationVersion(`3.4`, future)
-  val RemoveThisQualifier = MigrationVersion(`3.4`, future)
-  val UninitializedVars = MigrationVersion(`3.4`, future)
-  val VarargSpliceAscription = MigrationVersion(`3.4`, future)
-  val WildcardType = MigrationVersion(`3.4`, future)
-  val WithOperator = MigrationVersion(`3.4`, future)
-  val FunctionUnderscore = MigrationVersion(`3.4`, future)
+  require(warnFrom.ordinal <= errorFrom.ordinal)
 
-  val NonNamedArgumentInJavaAnnotation = MigrationVersion(`3.6`, `3.6`)
+  def needsPatch(using Context): Boolean =
+    sourceVersion.isMigrating && sourceVersion.isAtLeast(warnFrom)
 
-  val ImportWildcard = MigrationVersion(future, future)
-  val ImportRename = MigrationVersion(future, future)
-  val ParameterEnclosedByParenthesis = MigrationVersion(future, future)
-  val XmlLiteral = MigrationVersion(future, future)
+  def patchFrom: SourceVersion = warnFrom.prevMigrating
 
 end MigrationVersion