How to partition a list in a specific way

There is a new function in Mathematica 9 - ArrayReshape:

ArrayReshape[a, {2, 2, 2, 2}]
{{{{1, 2}, {3, 4}}, {{1, 2}, {3, 4}}}, {{{5, 6}, {7, 8}}, {{5, 6}, {7, 8}}}}

If you don't have Mathematica 9, this does the same thing as ArrayReshape as shown by Artes.

InverseFlatten[l_,dimensions_]:=Fold[Partition,Flatten@l,Most[Reverse[dimensions]]];
a = {{1, 2, 3, 4, 1, 2, 3, 4}, {5, 6, 7, 8, 5, 6, 7, 8}};
InverseFlatten[a, {2, 2, 2, 2}]
{{{{1, 2}, {3, 4}}, {{1, 2}, {3, 4}}}, {{{5, 6}, {7, 8}}, {{5, 6}, {7, 8}}}}

Artes' approach looks great. Here's another possibility:

Nest[Partition[#, 2] &, #, 2] & /@ a

{{{{1, 2}, {3, 4}}, {{1, 2}, {3, 4}}}, {{{5, 6}, {7, 8}}, {{5, 6}, {7, 8}}}}