Distinction between TFile and PStream is really strange. Wouldn't it be good idea to add implicit conversion between TFile and PStream and change all functions operating on TFile to ones operation on PStreams? That way backward compatibility in kept, and things like readAll work both on files and streams.
To avoid expensive (?) branch to small functions like readChar, specialized versions could be kept, so compiler will choose not to convert to PStream and use readChar(TFile), instead of readChar(TFile).
With multimethods everything could be much clearer. Streams could inherit from some interface-like class - that way one could override methods with specialized version (for example copyStream(a:FileStream, b:SocketStream) could be overriden with call to sendfile on Linux). That could be backward compatible with code using PStreams and TFiles, and would only result in breakage in code implementing PStreams, which is not a big deal on level of Nimrod development (I think).