I do not have Proteus so I can not run your simulation. I found the code difficult to read, I always use MPLAB for assembly code or use a 'C' compiler for high level language. Does Proteus allow named bits in registers? I find lines like "If STATUS.2 = 1 Then " can be confusing, I think you are asking if the Z bit is set, doesn't Proteus allow something like "STATUS.Z" to make it more readable.
I would still use external pull-up resistors in preference to the internal ones. You may find the current source from the internal pull-ups is too weak to charge and discharge the input lines, especially if the cable to the keys is long or has a relatively high capacitance. I still think you may have problems with multiple keys as well, don't forget that if more than one key is pressed and there is key bounce, it is still possible to read the wrong number back if the bounce momentarily breaks the contact and makes it look as though the keys were released and re-pressed.
Brian.