Como são as classes de valor definidas pelo usuário em Java?

Eu acho que entendi o novo recurso "classe de valor" do Scala 2.10, em comparação com o de Haskell.newtype:

trait BoundedValue[+This] extends Any { this: This =>

  def upperBound: This

  def lowerBound: This

}

class Probability @throws(classOf[IllegalArgumentException]) (v: Double) extends AnyVal with BoundedValue[Probability] {

  val value: Double = if ((v >= 0.0) && (v <= 1.0)) v else throw new IllegalArgumentException((v.toString) + "is not within the range [0.0, 1.0]")

  override val upperBound: Probability = new Probability(0.0)

  override val lowerBound: Probability = new Probability(1.0)

  // Implement probability arithmetic here;
  // will be represented by Double at runtime.

}

A pergunta que tenho é, como uma classe de valor aparece para o código Java que usa o pacote Scala no qual ele é declarado? A classe de valor aparece como uma classe de referência do lado do Java ou é completamente apagada (e, portanto, aparece como o tipo que ela envolve)? Em outras palavras, como o tipo seguro é uma classe de valor quando o Java está envolvido no nível de origem?

EDITAR

O código acima não irá compilar, de acordo com o documento SIP-15 (linkado na resposta de Daniel), porque as classes de valor não podem ter nenhuma lógica de inicialização, porquev deve ser explicitamente um val ouProbability deve ter umunbox método e um correspondentebox método em seu objeto complementar e porque as classes de valor devem ter exatamente um campo. O código correto é:

trait BoundedValue[This <: BoundedValue[This]] extends Any { this: This =>

  def upperBound: This

  def lowerBound: This

}

class Probability private[Probability] (value: Double) extends AnyVal with BoundedValue[Probability] {

  @inline override def upperBound: Probability = new Probability(0.0)

  @inline override def lowerBound: Probability = new Probability(1.0)

  @inline def unbox: Double = value

  // Implement probability arithmetic here;
  // will be represented by Double at runtime (mostly).

}

object Probability {

  @throws(classOf[IllegalArgumentException])
  def box(v: Double): Probability = if ((v >= 0.0) && (v <= 1.0)) new Probability(v) else throw new IllegalArgumentException((v.toString) + "is not within the range [0.0, 1.0]")

}

A questão em si ainda é válida como é, no entanto.

questionAnswers(1)

yourAnswerToTheQuestion