Here's an alternative with the option of faster scanning.
Attachment:
keyboard.png [ 14.72 KiB | Viewed 1161 times ]
The shift register controls which rows are selected. Make them active-low, and they can all be selected by pulsing ROW_CLR. Then you cycle through the columns and see which have keys pressed. Most of the time none will, and you can stop there.
If any columns report a pressed key, first disable all rows by shifting 1 into the shift register. Then select each column that you want to look at, and shift a single 0 through the row selects. Most of the time, if any key is pressed there will only be one, so you only need to test one column.
With some more logic you could use a shift register to select columns as well. This time you want the outputs to be active-high, so they'd need inverters. AND the column selects with their respective columns, then AND those signals together. That should go low if the selected key is pressed (and I haven't flipped the logic around somewhere in there - that's very possible).
That gives you a much quicker scan: first enable all rows and all columns. Most of the time that will report no key pressed, and you can stop there. If not, keep the columns enabled and go through the rows one by one to see which have keys pressed. Then you can select each column in just those rows.
Also, this design can be extended to larger keyboards by chaining multiple shift registers. You don't need any more I/O pins to control them.