The issue with levitation is likely due to touched being fired early. Perhaps try a different collision detection method? When it comes to relying on Touched for critical game functionality, I’d advise against it for a number of factors.
Two possible ways I can suggest is manually moving thrown objects through stepped raycasts, or alternatively try to pick up touched objects using spatial queries.
Edit: Alternatively you could try and fire a raycast of some sort after touched is fired to find a surface to attach to.