The macro implementation uses quasiquotes, which are available starting from 2.11.0-M4. That's the only reason, but IMO that's a good one. Compare https://github.com/jto/Play20/blob/new_validation_api/framework/src/play-datacommons/src/main/scala/play/api/data/mapping/MappingMacros.scala#L101-L138 with https://github.com/playframework/playframework/blob/master/framework/src/play-json/src/main/scala/play/api/libs/json/JsMacroImpl.scala#L11-L293