¿Enumeraciones Scala con objetos Singleton como elementos de enumeración y una posibilidad de iterar sobre ellos?

Ya miré elPregunta de Scala sobre la emulación de Javaenum yclases de caso vs. Enumeración pero parece demasiado esfuerzo por menos beneficio.

Básicamente me gustaría tener unvalues método que devuelve todos los objetos singleton deDayOfWeek sin repetirme algunas veces.

Así es como debería verse mi código:

object DayOfWeek extends MyEnum {
  object MONDAY extends DayOfWeek(1)
  object TUESDAY extends DayOfWeek(2)
  object WEDNESDAY extends DayOfWeek(3)
  object THURSDAY extends DayOfWeek(4)
  object FRIDAY extends DayOfWeek(5)
  object SATURDAY extends DayOfWeek(6)
  object SUNDAY extends DayOfWeek(7)
}

class DayOfWeek(ordinal: Int)

El métodovalues debería devolver algo como si se hubiera escrito así:

val values = Array(MONDAY, TUESDAY, WEDNESDAY, THURSDAY,
                   FRIDAY, SATURDAY, SUNDAY)

Todo debería pasar en elMyEnum rasgo, así que solo necesito extenderlo para obtener la funcionalidad.

trait MyEnum {
  val values = this.getClass.getField("MODULE$") etc. etc.
}

¿Alguna sugerencia de cómo se puede hacer esto exactamente? La idea es quevalues accede a la clase y encuentra todos los objetos singleton de la clase que están extendiendo.

Editar: Parece que todas las sugerencias no tienen en cuenta que el usuario también puede crear objetos que, por supuesto, deberían ser comparables a los definidos.

Trataré de dar otro ejemplo, tal vez sea más claro:

object MonthDay extends MyEnum {
  //Some important holidays
  object NewYear       extends MonthDay( 1,  1)
  object UnityDay      extends MonthDay(11,  9)
  object SaintNicholas extends MonthDay(12,  6)
  object Christmas     extends MonthDay(12, 24)
}

class MonthDay(month: Int, day: Int)

//Of course the user can create other MonthDays
val myBirthDay = new MonthDay(month, day)

if(!MonthDay.values.contains(myBirthDay)) "Well, I probably have to work"
else "Great, it is a holiday!"

Quiero tener un rasgo (MyEnum) que puedo mezclar en el objeto que contiene mis "objetos de enumeración" con métodos para devolver una lista de ellos (def values: List[MonthDay]) o iterar sobre ellos (def next: MonthDay odef previous: MonthDay)

PPS:Creé una nueva pregunta para la segunda parte de esta pregunta según lo solicitado por Ken Bloom.

Respuestas a la pregunta(3)

Su respuesta a la pregunta