A simple suggestion and something I recently put into my game. For all the horizontal upward faces, find if they are also the base of an adjacent horizontal face. For example, when I'm building my VBOs I run some code like this:
Color[] colors = new Color[4];
Color faceColor = GetColorForFace(x, y, z, face);
colors[0] = faceColor; //mpp
colors[1] = faceColor; //ppp
colors[2] = faceColor; //mpm
colors[3] = faceColor; //ppm
if (face == CubeFaceDirection.YPlus) {
if (Cube.IsSolidCube(GetCubeAt(x + 1, y + 1, z))) {
colors[1] = colors[1].darker();
colors[3] = colors[3].darker();
}
if (Cube.IsSolidCube(GetCubeAt(x - 1, y + 1, z))) {
colors[0] = colors[0].darker();
colors[2] = colors[2].darker();
}
if (Cube.IsSolidCube(GetCubeAt(x, y + 1, z + 1))) {
colors[0] = colors[0].darker();
colors[1] = colors[1].darker();
}
if (Cube.IsSolidCube(GetCubeAt(x, y + 1, z - 1))) {
colors[2] = colors[2].darker();
colors[3] = colors[3].darker();
}
}
Where colors[] are originally set to whatever the lighting makes them, then darkened if there are cubes next-to-and-above. colors[] represents the colors the 4 vertices that make up the two Y+ facing triangles.
The effect is something like the following. Where on the left is the original rendering style and the right is the new "shaded" style.

EDIT:
After looking at my image again, I noticed I left out the corner case (literally!), so I'll add those cases to my code:
if (Cube.IsSolidCube(GetCubeAt(x + 1, y + 1, z+ 1))) {
colors[1] = colors[1].darker();
}
if (Cube.IsSolidCube(GetCubeAt(x + 1, y + 1, z - 1))) {
colors[3] = colors[3].darker();
}
if (Cube.IsSolidCube(GetCubeAt(x - 1, y + 1, z + 1))) {
colors[0] = colors[0].darker();
}
if (Cube.IsSolidCube(GetCubeAt(x - 1, y + 1, z - 1))) {
colors[2] = colors[2].darker();
}