Scala has an amazing library do deal with enums: enumeratum

libraryDependencies += "com.beachape" %% "enumeratum" % "1.7.3"

it gives great declarative enum naming:

import enumeratum.EnumEntry._
import enumeratum._

sealed trait Color extends EnumEntry with Lowercase
object Color extends Enum[Color] {
  override def values: IndexedSeq[Color] = findValues
  case object Red extends Color
  case object Green extends Color
}

By mixing Lowercase it automatically provides name transformation based on the object name and the Lowercase rule

val c1 = Color.Red.entryName
// c1: String = "red"
val c2 = Color.Green.entryName
// c2: String = "green"

By changing Lowercase to Uppercase we will get another name transformer and name as a result

sealed trait Color extends EnumEntry with Uppercase

and get

val c1 = Color.Red.entryName
// c1: String = "RED"
val c2 = Color.Green.entryName
// c2: String = "GREEN"

but what if, maybe due to some weird requirements, maybe due to the kind of legacy, you need to have red and GREEN? Library copes with that elegantly! Simply override method entryName

import enumeratum.EnumEntry._
import enumeratum._

sealed trait Color2 extends EnumEntry with Lowercase
object Color2 extends Enum[Color2] {
  override def values: IndexedSeq[Color2] = findValues
  case object Red extends Color2
  case object Green extends Color2 {
    override def entryName: String = "GREEN"
  }
}

Lowercase rule will be applied to all elements but to other, for which we need another rule, we simply override withName method. And we get

val c3 = Color2.Red.entryName
// c3: String = "red"
val c4 = Color2.Green.entryName
// c4: String = "GREEN"