The bug is still there in XE8 (and probably in other versions too). As pointed out above by RRUZ it lies in the SysUtils implementations of BOTH DirectoryExists() and TDirectory.Exists().
The problem is with that long list of "checks" that assumes that they are the only valid reasons that INVALID_FILE_ATTRIBUTES may have been returned in the context of "existence" of the folder. But the reason we call these routines is nearly always so we can check whether we can actually use the folder we are asking about. Having INVALID_FILE_ATTRIBUTES almost always means that we cannot. Either way, the tests presently being done do not produce sensible results. This fact alone makes it a totally redundant exercise, as it allows certain other fault codes to slip through the net and set the end result to TRUE when it should not be. Whilst I can only imagine that there was originally some method to this madness, along the lines of "oh, it exists but might be invalid", it falls foul of the inherent truth that the future may bring many more codes generated by many as yet unknown file systems and/or hardware: so the bottom line is that for 99.9% of usage, getting INVALID_FILE_ATTRIBUTES should mean folder not usable, and it is therefore illogical to allow TRUE to be returned once that has already been established.
Unfortunately we cannot know whether there is code that relies upon the present behavior to identify "existing paths with issues" - in which case the call to the routine as it presently exists would have to be preceded with a path-syntax validation check first: otherwise it would say that a path described with bad syntax "exists", which is a nonsense! You can't redo the GetLastError afterwards, because the error will have already been cleared.
So the only cure is to wrap any Sysutils.DirectoryExists and (unfortunately also) TDirectory.Exists calls with code that eliminates the problem up-front. For example:
DirectoryUsable(const Directory: string; FollowLink: Boolean = True): Boolean;
begin
Result := GetFileAttributes(PChar(Directory)) <> INVALID_FILE_ATTRIBUTES;
if Result then Result := DirectoryExists( Directory, FollowLink );
end;
Either that, or you do a separate up-front validation of all the "bad" cases you know about and Embarcadero missed - i.e. play the same losing game as they did.
Horrible, but there you go.
You could also modify the SysUtils library yourself, to add the missing cases, which you would have to redo with every release of Delphi and for every new case you encounter. It would probably be better if Embarcadero finally "bites the bullet" and finds a better solution for this problem. Perhaps by using another defaulted flag parameter that says "reject all invalid directories". I would further suggest that this defaults to TRUE.