The MCP23017 is a great chip - not only do you get 16 bidirectional I/O lines with optional pull-ups, but you can also get an interrupt-on-change function that can can be set for individual pins.
There is also an SPI version if you don't want to use I2C.