I/O expansion options for Leonardo

Hi everyone.

I am currently busy creating a custom controller which will have ALLOT of switches and button inputs. Is there a way I can expand the I/O pins on the Leonardo?

Just some terms that you can search for:

I2C or SPI port expanders.
Shift registers (serial in / parallel out like 74HC595 gives more output pins and parallel in / serial out like 74HC165 gives more input pins).

If you wish to save time and trouble, get an arduino nano or mega2560 (for pins) to sense these buttons, and user serial port to send the button pushes to leonardo so it can simulate key presses. Will this be a solution?