With a bit more work, we can take a similar approach to J.M.'s answer to build a (waterwater tight) model with a base.
text = BoundaryDiscretizeGraphics[Text["Hello"], _Text] elongate[{a_, b_}] := With[{d = 0.05 (b - a)}, {a - d, b + d}] full = DiscretizeGraphics[Rectangle @@ Transpose[elongate /@ RegionBounds[text]]] diff = RegionDifference[full, text] etext = RegionProduct[RegionBoundary[text], Line[{{0.}, {2.}}]] final = DiscretizeGraphics @ Show[ etext, RegionProduct[text, Point[{2.}]], RegionProduct[diff, Point[{0.}]], RegionProduct[full, Point[{-1.}]], RegionProduct[RegionBoundary[full], Line[{{-1.}, {0.}}]] ] The only defects here are misoriented faces (which can be fixed with RepairMesh), but this is indeed a water tight model:
FindMeshDefects[final] 





