It seems to be a bad idea until you realize that there is a protocol that takes care of class redefinitions without breaking everything. It is still possible that when changing your class, you introduce a bug in your application, in the same way that it would introduce a bug if you stopped your C# program, modified a class and reran it without update some other part of the code that did not adjust its assumptions.
OP mentions updating a running service, but I think I can be wise to suggest doing it first on a test machine. The kind of bugs introduced are however not due to a broken understanding of classes by Common Lisp, but rather on the consequences of the changes in application code. I don't see how "this just leads to undefined behaviour within your type system", though.
> If I pass an int to a method I don't expect it's type to be changed by said method.
I made a little game where objects could go beyond the limits of the world. In the UPDATE method of those classes, when the object escapes the boundaries of the world, I would change their class to the empty GARBAGE class. In a later pass, I remove all instances of GARBAGE. This is equivalent to having an ALIVE? member in all objects, except you don't need to.
When developping the game, I would periodically discover that my classes would need to be different that what I originally thought, and I modified them in the current Lisp environment instead of stopping the program and recompiling it. This is very convenient. Of course, changing classes at runtime becomes rare when the programs is run by the user of your program.
> In C# if I pass an int to a method that can't handle a following int*int because the result will overflow 32bits, then I'll just do a '.. new BigInt(int)' and go from there.
Why are you only talking about ints? The result would not overflow in Common Lisp, it would return a bignum. Changing a method at runtime is useful for live-coding, exactly as for standard functions.
Now, look at "cl-protobufs": you define a Lisp system (defsystem) where you add a depedence to a :protobuf-file, and here is what you get: the .proto file is parsed as a protocol buffer schema and generates a set of classes and methods in a new package. You can do this in java with Maven, of course, but here you generate code within your language, without restarting your environment.