At first, I thought it was because of how Scala resolves implicits. Somehow, I thought this implicit in Int.scala was getting prioritized. The rules for priority are usually intuitive, but for edge cases like this, we refer to 6.26.3 Overloading Resolution. The thing that confused me though was that the call to int2double isn't there - it is already inlined to .toDouble!!

Having dug a bit more, it appears that there is an edge case concerning value types which applies to the conversion from Int to Double. Something called weak conformance dictates how we convert Byte -> Short -> Int -> Long -> Float -> Double. So, all in all, I don't think you can overrule this builtin conversion...

Numeric Widening

If e has a primitive number type which weakly conforms to the expected type, it is widened to the expected type
using one of the numeric conversion methods toShort, toChar,
toInt, toLong, toFloat, toDouble...

EDIT

Also, in case anyone is wondering why this is a thing, from Martin Odersky (this is an old link - don't trust what is being said here in general), we run into common problems if we don't have these extra special conversions:

scala-hypothetical> val x = List(1, 2.0)
x: List[AnyVal]

Not very intuitive...

Email codedump link for Implicit conversion from Int to Double in scala doesn&#39;t work