Answering, you should inline and typelevel programming using good old implicits :
implicit inline def name2user(inline n: String)
(implicit inline ev: Username = n): User = User(n)
val user3: User = name2user("@john") // compile
val user4: User = "@john" // compile
val user5: User = "#john" // does not compile as it should