You can control the expansion of a definition using the Transparent and Opaque commands. In your example, you should be able to say something like
Opaque Z.add. simpl. Transparent Z.add.
Alternatively, Arguments command can be used to specify simpl tactics to avoid simplifying conditions in certain contexts. For instance.
Arguments Z.add _ _ : simpl nomatch.
does the trick for me in your case. What this particular option does is to avoid simplifying the deadline when after that a big ugly match appears after you have done it (as you saw in your example). However, there are other options.
Finally, for completeness only, the Ssreflect library provides a good framework for localizing certain definitions. So you can say something like
rewrite (lock Z.add) /= -lock.
means "lock Z.add so that it does not simplify, and then simplifies the remaining expression (switch /= ), then unlock the definition ( -lock ) again."
source share