Serial-to-parallel shift registers like the 74HC164 or 74HC595 are good for driving a lot of outputs with a few microcontroller pins. Any time you have that situation, consider a 74HC164 or 74HC595 shift register. LEDs are obvious, but if you really wanted to write, for example, a parallel memory's address pins or the digital input of a parallel DAC, you could use a 74HC164 or 74HC595 shift register to be able to send signals to them without eating all your pins.
Parallel-to-serial shift registers like the 74HC165 are good for reading a lot of inputs with a few microcontroller pins. Any time you have that situation, consider a 74HC165 shift register. A large set of switches are obvious, but if you really wanted to read, for example, a parallel memory's data pins or the output of a parallel ADC, you could use a 74HC165 shift register to be able to retrieve signals from them without eating all your pins.
In both cases, you trade pins for speed. With the Arduino and its very slow default port access speeds, you might lower the number of times you can touch an external device to a few thousands of times per second if you are using a shift register to control a large number of inputs or outputs. Still, this is usually fast enough for most applications.
This document says the 74HC164 can source 25mA per pin or sink 20mA per pin and dissipate 750mW per package. I would say it is perfectly fine to drive normal LEDs on such an IC. Limit current to 20mA with resistors.