A few thoughts:

> the complexity of some instructions (e.g. DJNZ)

Well, of course the idea of DJNZ was to implement a very common pattern (decrement a register and jump (normally backwards) if the result was not zero) - this tended to simplify code rather than make it more complex.

> However I couldn't keep all instructions and timings in my head.

I was never really interested in the timings, but I did get to the stage (not by conscious memorisation) of being able to assemble and disassemble Z80 code in my head, with some accuracy.

> I preferred, however, the fact that I/O was memory mapped on the 6502.

Many (most?) Z80 systems used memory mapped I/O. It's down to the hardware designer.

> I did get to the stage (not by conscious memorisation) of being able to assemble and disassemble Z80 code in my head, with some accuracy.

Same here.

I never got any fluency using EXX and the shadow registers - there were so few situations it was worth the effort. I always felt like I must be missing something.

I suspect the shadow registers were there to improve interrupt handling, reserve their use exclusively to an interrupt handler, and you could save time in not having to store registers in memory.

That, or in general for system calls. In particular EX AF,AF' + EXX allowed you to exchange all registers other than AF, to be able to return an error code or status.