One reason is to provide a more uniform interface to an object in some languages- you no longer have to deal with the syntactic difference between fields and methods; you always deal with methods.
A second reason is that you hide the implementation of the object, allowing you to change it internally without affecting its clients. A classic example is one of coordinates - if you have a coordinate represented via cartesian coordinates, and switch the internal representation to polar, if you used getters and setters your program would still work even though the x and y fields are gone. This also allows you to use polymorphism - two objects representing the same abstraction, but each with a different implementation of their state.
Accessing state via methods also lets you add things like synchronization.