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}}]
