I would be surprised if the "WORD val = ( Pins[23] ) ? 1:0;" didn't work. I think the PinIO class just only implements the conversion operators for int, BYTE, and bool. That 3rd example should be using the bool conversion and assigning 1 or 0 to your WORD, does it give that same conversion error?
I would either just add the WORD operator to the PinIO class or go with "WORD val = (bool) Pins[23];"