maximum delay() is 32767ms ?

If the arduino distribution had delay declared as a macro (with the actual function renamed to _delay) then this would do the cast without the user knowing anything about it. It would look exactly the same as now but would operate as a long.

Again, the problem is with the arithmetic, not with the delay() function. When you multiply the 16-bit signed integers 60 and 1000, you don't get 60000, but rather -5536. (The biggest number you can represent as a 16-bit signed integer is 32767.) Casting that result to an unsigned long doesn't get you 60000 back. You need to do something to make sure the arithmetic is carried out using unsigned longs (32-bit integers) in the first place. It's not clear there's any convenient way to do that automatically, however.

Casting the parameter in a macro to an unsigned long forces the compiler to do the entire calculation as a long in other platforms I have used. Are you saying that the suggestion to use a macro with the cast wont work here?