a decoder would be a good way to reduce many pins to few, but i would only be able to control one of the output pins at a time. so this would be great if i wanted to light up one led at a time in the matrix.
Yes. Or in the case of a matrix display, also useful for selecting one row at a time.
but if i ever wanted to light up multiple ones, im gonna need a shift register.
You can also combine using a shiftregister and a decoder with a matrix display. Using a shiftregister for column data and a 3-to-8 line decoder for (de?)multiplexing the rows, for example. To further reduce pins needed, the decoder can be connected to a counter (but then some synchronizing measures should be taken, like resetting the counter each frame or similar).
You should have some form of driver, especially for the rows as these may source/sink the currents for one hole row (all columns, if row multiplexing is used) at once.
Another alternative to the 74HC138 is the 74HC238 (outputs inverted).
Btw, what is really correct to say: row multiplexing, or row demultiplexing? I think the last but everyone (me included) seems to say row multiplexing.