There are two very good reasons for naming constants. The best reason is to clarify code by naming the constant (Pi, EarthDiameter, SpeedofLight, AvagadroNumber, etc) rather than refer to the value directly. Another is to name quantities that are considered constant, but may change due to changing specifications (examples: MAX_CHILD_THREADS, BtreeRadix). But placing the definition of these constants in one location, revising their values to meet future needs becomes easier.
Providing names for the constants you mention (0,1,true,false, etc) already have their meaning. Naming the constant 0 to be Zero really adds nothing. There is a small value to naming the empty string "", as you are providing some additional meaning -- not just that the literal is "", but that your meant to say the EmptyString.
Many systems define numeric values to have meaning, such as the Linux/Unix errno.h, providing systemwide meaning to specific integers. Thus, there is value to definitions such as,
public static final int SUCCESS = 0;
public static final int EPERM = 1; // Operation not permitted
public static final int ENOENT= 2; // No such file or directory
public static final int ESRCH = 3; // No such process
public static final int EINTR = 4; // Interrupted system call
Because using those names gives clarity to the intention of the developer.