I believe we all agree there is a huge advantage of avoiding global variables. Thing is similar for public/private visibility in class, but the advantages are much less compare to global/local variable.
I can understand SymbolicFrank's reason that inherited class can change them. There were times, when I wrote an inherited class that needs to modify a private field of its ancestor class. I had to move it to the less narrow visibility section. I might thought maybe I should make all fields public, that should save my time in the future for moving them to a higher visibility section.
But I thought more deeply. The problem was not caused by not making them public. But because I hadn't properly plan the class before I wrote them.
For the codes I wrote for others, I usually use only public and private members. But for the codes I maintain personally, I will try to put them at the lowest visibility section if possible, strict private. By doing so, I force me to think and plan carefully before I write the code, should I put it in strict private, protected or public section? I make it a habit, to plan it before writing it.
Novices write codes without planning it. I prefer and force myself planning before writing it, the professional way.
Also, not making all fields/methods public means self-documenting. So, if I inherit the class in the future, I only need to check the public or protected section, which has less members because I already moved them to the lower visibility sections. Each section has different meaning to me, this serves as self-documentation for me in the future.
But, I think how much one can benefit from putting class members at the as lowest visibility as possible depends on the programmer's convenience. Same program can be written using different ways, just pick the way you feel most convenient.