You can use traits instead if you don't need the original class:
trait StatWithBounds[A] {
def min: A
def max: A
def currentValue: A
}
trait StatBetween0And20 extends StatWithBounds[Int] {
def min = 0
def max = 20
}
class Strength(val currentValue: Int) extends StatBetween0And20
class Intelligence(val currentValue: Int) extends StatBetween0And20
...
Alternatively, you can simply not use such long variable names!
class Stat[A](val min: A, val max: A, val current: A)
class Stat20(i: Int) extends Stat[Int](0, 20, i)
class Strength(i: Int) extends Stat20(i)
class Intelligence(i: Int) extends Stat20(i)
...
See how much less noisy that is? Long variable names are a form of boilerplate. Sometimes you need it for clarity, but not, usually, just to pass on an argument to a constructor.