It is also possible to use AdjustmentBox, wrapped in DisplayForm, to get very fine-grained control over placement of FrameTicks text.
The following is based on code I use for my own real-world application.
myTickList[min_, max_, seg_, shift_?NumericQ, len_: 0] :=
Table[{i,
DisplayForm[
AdjustmentBox[Style[i, LineSpacing -> {0, 12}],
BoxBaselineShift -> shift]], {len, 0}}, {i,
If[Head[seg] === List, Union[{min, max}, seg],
Range[min, max, seg]]}]
An example of its use. You can see that I've shifted the left-hand frame labels up (with a negative number) and the right-hand ones down (with a positive number).
ListLinePlot[Accumulate@RandomVariate[NormalDistribution[0, 0.5], 40],
Frame -> True, GridLines -> {None, Automatic},
FrameTicks -> {{myTickList[-4, 4, 1, -2],
myTickList[-4, 4, 1, 2]}, {Automatic, None}}]
