You can abstract this stuff away pretty well:
scala> trait NewType[A]:
| opaque type Type = A
| def apply(a: A): Type = a
| extension (a: Type) def value: A = a
| end NewType
// defined trait NewType
scala> object Bar extends NewType[String]
// defined object Bar
scala> val bar = Bar("foo")
val bar: Bar.Type = foo
scala> bar.value
val res6: String = foo
Of course it’s not 100% the same API and has some drawbacks as discussed in the other thread (mainly with boxing of primitives).