You would need to find bi-directional shift registers for your keypad but twice good news;
1) They exist at least up to 8 bits wide. Look around.
2) Keypads don't need blazing interface speed, serial to parallel will do fine.
Okay, but should an I2C be easier?
And slower and not sure you can daisy-chain I2C.
If you connect via SPI bus then you can add another or two for the lcd?
What do you mean?
SPI bus is possible to connect many serial devices. Each has a wire to make it active. If not active it is just there until activated. For the price of one extra pin you add a device like shift register or SD adapter or even something with multiple chips to run on one signal. As long as the signals are there, how is flexible which opens up possibilities in design.
Just make sure there's enough power for everything without overtaxing the Arduino. You can light up 8x8x8 RGB leds and make the colors dance with shift registers but it will need external power going to the shift registers.
You can control the keypad and lcd using the ATmega's hardware-supported SPI pins, leaving the regular serial pins that have INT0 and INT1 (the only edge-triggered interrupts) open. There is an SPI library for Arduino too. That should take some pain away!
Perhaps there is also for I2C. You can save more pins there but lose some speed sending ID messages for activation instead of using control wires. I2C uses the same ATmega hardware that SPI does.
Look up SPI bus on Wikipedia, nice article with better explanation.